0

Java言語で保証されたfinalize()に似た動作をオブジェクトに実装したいと思います。ガベージコレクションが発生する直前にいくつかのステートメントを実行したい。ここではfinallyブロックは役に立たないことに注意してください。finallyはtryブロックの直後に実行されるため、これは私の要件ではありません。基本的に、JVMのヒープからアンロードされる直前にオブジェクトをシリアル化したいです。お知らせ下さい。

4

3 に答える 3

1

JVMがメソッドを呼び出すことが保証されていないため、finalize()があっても実行されるメソッドを実装する方法はありません。たとえば、現在のJVMによっては、プログラムの終了時にヒープに残されたオブジェクトのメソッドが呼び出されない場合があります。finalize()

通常finalize()、メモリ以外のリソースを解放するために使用することはお勧めしません。リソースを解放する以外のことを行うことはお勧めしません。オブジェクトをシリアル化する場合は、別の時点を選択してみてください。

ファイナライザーについて知っておく必要のあるほとんどすべてをまとめた良い記事があります。

于 2011-12-20T17:44:28.500 に答える
0

私はファントムリファレンス(スターウォーズの悪い映画の1つのように聞こえます)を使用したことはありませんが、それでうまくいくようです。

「コレクターが指示対象を再利用できると判断した後にキューに入れられるファントム参照オブジェクト。ファントム参照は、Javaファイナライズメカニズムで可能な方法よりも柔軟な方法で、死前のクリーンアップアクションをスケジュールするために最もよく使用されます。

于 2011-12-20T18:04:05.383 に答える
0

シャットダウン時にJVMにフックを追加できます。http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29を参照してください

実行可能と思われる@user949300のファントムと一緒に。ただし、フックはすべてのオブジェクトへの弱参照を格納する必要があります。フック用のJavaServiceインターフェースを作成すると、オブジェクトコンストラクターで使用できます。でも醜いですね。

于 2011-12-20T18:18:13.047 に答える