■ファイナライズの実行(finalize) ■Effective Java の2章6項目「ファイナライザを避ける」をテスト ■説明 C++などとは異なり、メモリー管理はJVMの仕事である。Javaでは、finalize()メソッドが 呼ばれる保証がされていない。よってfinalize()メソッドでc++のデストラクタと同等な処理、 つまりメモリ開放、リソース開放を行ってはいけない。 public class F { public static void main(String [] args) { F f = new F(); f.run(); // ファイナライザが実行する保証はしない。 System.runFinalization(); System.gc(); // ファイナライズを保証する。 // しかしJavaDocでは、推奨されていません。と書かれている。 System.runFinalizersOnExit(true); } public void run() { Object [] elements = new Object[10000]; for (int i = 0; i < elements.length; i++) { elements[i] = new Object(); } elements = null; } public F() { System.out.println("constructor"); } public void finalize() throws Throwable { super.finalize(); System.out.println("finalizer"); } } ■ソースコード説明 main()メソッドで、以下のように、finalizeの実行とガベージコレクタの実行を行っているが、 実際にF#finalize()は呼ばれない。環境によっては、呼ばれるかもしれないが実際に試してもらいたい。 System.runFinalization(); System.gc(); System#runFinalizersOnExit()メソッドは、finalize()の実行を保証するので、F#finalize()が呼ばれる。 しかしコンパイル時に、推奨されないとメッセージがでる。また、JavaDoc等でもその理由が書いてあるので 参照されたし。 ■実行 $ javac F.java 注: F.java は推奨されない API を使用またはオーバーライドしています。 注: 詳細については、-deprecation オプションを指定して再コンパイルしてください。 $ java F constructor finalizer