マイナー・マイナー

隠れた名作の発掘が生きがい。

ファイナライザとガベージコレクション


スポンサードリンク

ファイナライザとは,インスタンスがメモリ領域から破棄される直前に呼び出されるメソッドです.ファイナライザのメソッド名はfinalize()で,次のように定義されています.
protected void finalize() throws Throwable()


メモリ領域からのインスタンスの破棄はガベージコレクションによって行われます.Javaではガベージコレクションを自動で行ってくれますが,破棄のタイミングをプログラムで指定することはできないようです.しかし,次のメソッドでガベージコレクションを促すことができます.
System.gc();
Runtime.getRuntime().gc();


実行例

class Finalizer {
	String label;

	Finalizer(String label) {
		this.label = label;
	}

	protected void finalize() {
		System.out.println(label + " finalized");
	}
}

public class FinalizerTest {

	public static void main(String[] args) {

		/*labelに"A"の値を持つFinalizer型のインスタンスを
		 *label-Aと略す.
		 */
		Finalizer finalizer = new Finalizer("A");

		/*finalizerの参照をlabel-Aからlabel-Bに置き換え,
		 *label-Aをガベージコレクションの対象とする.
		 */
		finalizer = new Finalizer("B");
		System.gc();

		/*finalizerの参照をlabel-Bからlabel-Cに置き換え,
		 *label-Bをガベージコレクションの対象とする.
		 */
		finalizer = new Finalizer("C");
		Runtime.getRuntime().gc();
	}
}


実行結果


A finalized
B finalized

実際にはlabel-Aとlabel-Bの解放の順番は入れ替わるかもしれないですが,未確認です.