本日はガベージコレクタに関して。
ガベージコレクタとは?
JavaはCなどと違い、JVM自体がメモリの確保や解放をするため、プログラマがメモリの解放や確保をコードで書く必要はありません。
メモリの解放はJavaの実行環境上で稼動しているガベージコレクタと呼ばれるプログラムが行っています。プログラムが使用しなくなったメモリ領域を検出し、解放します。
オブジェクトがどこからか参照されている間はガベージコレクタの対象になることはありません。
参照されなくなることで、ガベージコレクタの対象となります。
オブジェクトの参照を取り除く方法は2つあります。
1 nullを代入
プログラムの中で明示的にこの変数はオブジェクトを参照しないということを表現するためにnullを使います。
1 2 3 4 5 |
ClassHoge ch1 = new ClassHoge(); ClassHoge ch2 = ch1; ch1 = null; ch2 = null; //この段階でEmployeeオブジェクトはどこからも参照されないため、ガベージコレクタの対象になる |
2 参照変数を他のオブジェクトに割り当てる
オブジェクトを参照している変数に、新たなオブジェクトを割り当てたことで、元のオブジェクトがどこからも参照されなくなったら、ガベージコレクタの対象になります。
1 2 3 |
ClassHoge ch = new ClassHoge(); ch = new ClassHoge(); //最初の変数がガベージコレクタの対象となる |
finalize()メソッドの定義
finalize()メソッドはガベージコレクタによってオブジェクトが破棄される寸前にJavaの実行環境から必ず呼び出されるメソッドです。
したがって、そのオブジェクトが使っていたリソースを解放するといった処理です。
このメソッドの実行自体はJavaの実行環境自体にゆだねられているため、タイミングは保障できません。