ガベージコレクション
日本語 | ゴミ拾い |
英語 | garbage collection |
ふりがな | がべーじこれくしょん |
フリガナ | ガベージコレクション |
インスタンスを削除するシステム。
インスタンスは、参照型変数やプリミティブ型変数と異なり、寿命で消えることはない。逆に言うと、一度作ったインスタンスを、明示的に消去することはできない。
このインスタンスを消去するのが「ガベージコレクション」である。
ガベージコレクションでは、「ガベージコレクタ」が定期的に全インスタンスをチェックし、インスタンスが「どの参照型変数からも参照されていない」場合にはインスタンスを削除する。
このシステムにより、C++言語等であった「インスタンスを削除し忘れる」「削除済みインスタンスを使用してエラーになる」といった問題が回避される。
反面、インスタンスがいつ削除されるか分からないため、インスタンスの作成を大量に行う場合にメモリを圧迫し、パフォーマンス的に問題になったり、場合によっては異常終了する場合もある。
参照型変数にnullをセットすることでガベージコレクションされやすくなる、と言われているが、必ず行われるとは言えず、工数の増加やバグが発生する可能性も無視できないため、過信しない方がいいだろう。
ちなみに「ガベージコレクション」というカタカナは実際の発音とはかなり異なる。だが、Javaが登場した頃の初期のドキュメントで「ガベージコレクション」と訳されていたためこの用語が定着してしまった。
後に「正しい発音にしよう」ということになり「ガーベジコレクション」「ガーベッジコレクション」「ガーベージコレクション」といったカタカナも生まれているが、今のところはまだ「ガベージコレクション」の方が一般的である。
インスタンスは、参照型変数やプリミティブ型変数と異なり、寿命で消えることはない。逆に言うと、一度作ったインスタンスを、明示的に消去することはできない。
このインスタンスを消去するのが「ガベージコレクション」である。
ガベージコレクションでは、「ガベージコレクタ」が定期的に全インスタンスをチェックし、インスタンスが「どの参照型変数からも参照されていない」場合にはインスタンスを削除する。
このシステムにより、C++言語等であった「インスタンスを削除し忘れる」「削除済みインスタンスを使用してエラーになる」といった問題が回避される。
反面、インスタンスがいつ削除されるか分からないため、インスタンスの作成を大量に行う場合にメモリを圧迫し、パフォーマンス的に問題になったり、場合によっては異常終了する場合もある。
参照型変数にnullをセットすることでガベージコレクションされやすくなる、と言われているが、必ず行われるとは言えず、工数の増加やバグが発生する可能性も無視できないため、過信しない方がいいだろう。
ちなみに「ガベージコレクション」というカタカナは実際の発音とはかなり異なる。だが、Javaが登場した頃の初期のドキュメントで「ガベージコレクション」と訳されていたためこの用語が定着してしまった。
後に「正しい発音にしよう」ということになり「ガーベジコレクション」「ガーベッジコレクション」「ガーベージコレクション」といったカタカナも生まれているが、今のところはまだ「ガベージコレクション」の方が一般的である。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
Sample sample = new Sample();
sample.createInstance();
sample.createInstanceAndSetNull();
}
/**
* インスタンスを作るメソッド。
*/
private void createInstance()
{
// Stringクラスを作ります。
String string = new String( "あいうえお" );
// たとえば、こうして作られたStringクラスのインスタンスは、
// このメソッドを抜けても無くなりません。
// このメソッドを抜けるとstringはスコープから外れるので
// 無くなりますが、この変数がなくなっても参照が無くなるだけで
// インスタンスそのものはなくなりません。
// インスタンスが無くなるのはガベージコレクタが
// 削除するまでです。
}
/**
* インスタンスを作ってnullをセットするメソッド。
*/
private void createInstanceAndSetNull()
{
// Stringクラスを作ります。
String string = new String( "あいうえお" );
// stringにnullをセットします。
string = null;
// これをすると、明示的に
// 「インスタンスはどの変数からも参照されなくなった」
// ことになるため、ガベージコレクタが削除しやすくなる、と
// 言われています。ただし、これは「おまじない」レベルなので
// 過信はできません。
}
}
public class Sample
{
public static void main( String[] args )
{
Sample sample = new Sample();
sample.createInstance();
sample.createInstanceAndSetNull();
}
/**
* インスタンスを作るメソッド。
*/
private void createInstance()
{
// Stringクラスを作ります。
String string = new String( "あいうえお" );
// たとえば、こうして作られたStringクラスのインスタンスは、
// このメソッドを抜けても無くなりません。
// このメソッドを抜けるとstringはスコープから外れるので
// 無くなりますが、この変数がなくなっても参照が無くなるだけで
// インスタンスそのものはなくなりません。
// インスタンスが無くなるのはガベージコレクタが
// 削除するまでです。
}
/**
* インスタンスを作ってnullをセットするメソッド。
*/
private void createInstanceAndSetNull()
{
// Stringクラスを作ります。
String string = new String( "あいうえお" );
// stringにnullをセットします。
string = null;
// これをすると、明示的に
// 「インスタンスはどの変数からも参照されなくなった」
// ことになるため、ガベージコレクタが削除しやすくなる、と
// 言われています。ただし、これは「おまじない」レベルなので
// 過信はできません。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { Sample sample = new Sample(); sample.createInstance(); sample.createInstanceAndSetNull(); } /** * インスタンスを作るメソッド。 */ private void createInstance() { // Stringクラスを作ります。 String string = new String( "あいうえお" ); // たとえば、こうして作られたStringクラスのインスタンスは、 // このメソッドを抜けても無くなりません。 // このメソッドを抜けるとstringはスコープから外れるので // 無くなりますが、この変数がなくなっても参照が無くなるだけで // インスタンスそのものはなくなりません。 // インスタンスが無くなるのはガベージコレクタが // 削除するまでです。 } /** * インスタンスを作ってnullをセットするメソッド。 */ private void createInstanceAndSetNull() { // Stringクラスを作ります。 String string = new String( "あいうえお" ); // stringにnullをセットします。 string = null; // これをすると、明示的に // 「インスタンスはどの変数からも参照されなくなった」 // ことになるため、ガベージコレクタが削除しやすくなる、と // 言われています。ただし、これは「おまじない」レベルなので // 過信はできません。 } }