PS:finalize()
に依存せず、正しくクリーンアップする方法を知っています。JVM/GCはプログラム/スレッド終了時に `finalize()`を呼び出しますか?
Javaは、プログラムの終了時に適切なガベージコレクションが行われることを保証しませんか?
など。いくつかのデータを頻繁にシリアライズするのではなく、キャッシュに保存しておきたいと思っていますが、何らかの理由でクラッシュを除いてプログラムが正常に終了すると、キャッシュはDB/file/someに書き込まれるという希望でfinalize()
を実装しました。 finalize()メソッドで自分のコードで保存します。しかし、以下の少しの実験によると、JVMはメモリを "正常に"クリーンアップしないように思われます。ただ終了します。
Java spec(プログラム終了を参照)は、終了時にmemory/gcがどのように処理されるかを示しています。または、私は仕様の別のセクションを見ていなければなりませんか?私は、何finalize()
が呼び出されていないいずれかSystem.gc()
コメントを解除した場合
- :
は、Windows上で7
public class Main { // just so GC might feel there is something to free.. private int[] intarr = new int[10000]; public static void main(String[] args) { System.out.println("entry"); Main m = new Main(); m.foo(); m = new Main(); // System.gc(); m.foo(); m = null; // System.gc(); System.out.println("before System.exit(0);"); System.exit(0); } @Override protected void finalize() throws Throwable { System.out.println("finalize()"); super.finalize(); } public void foo() { System.out.println("foo()"); } } /* * Prints: * entry * foo() * foo() * before System.exit(0); */
バリエーション1.6.0.27 64ビットを用いて、例えば以下の(端部における出力)、テイク。
System.gc()
の両方をコメント解除すると、finalize()
が2回呼び出されます。System.exit()
の呼び出しの有無は、finalize()
の呼び出しに影響しません。
あなたが持っている問題は、プログラムの任意の時点で不正に死ぬことができるということです。また、再起動時にクリーンアップが必要な場合もあります。 –