2011-12-20 9 views
0

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

+2

close()メソッドを実装します。ここでの議論http://stackoverflow.com/questions/158174/why-would-youever-implement-finalize –

+0

ええ、私はそれを理解しているclose()は、缶の最新のキックです。 –

答えて

0

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

@ user949300のファントムと一緒に使えるようです。ただし、フックはすべてのオブジェクトへの弱い参照を格納する必要があります。フック用のJavaサービスインタフェースを作成する場合は、オブジェクトコンストラクタでそのサービスインタフェースを使用できます。しかし、醜いですね。

1

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

finalize()を使用してメモリ以外のリソースを解放するのは一般的にお勧めできません。リソースを解放する以外の方法はほとんどありません。オブジェクトをシリアライズする場合は、別の時点を選択してみてください。

ファイナライザについて知っておくべきことをほぼまとめたgood articleがあります。

0

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

"ファクタム参照オブジェクトは、コレクタが他の方法で再利用できると判断した後にエンキューされます。ファントム参照は、Javaファイナライズで可能なよりも柔軟性の高い方法で、メカニズム。 "

+0

素晴らしい提案、本当に私の問題を解決しました。これははるか遠くのファントム参照オブジェクト[http://www.pawlan.com/monica/articles/refobjs/]の最高の記事の1つです – sij

+0

参考のためにありがとう - よく見えます。 – user949300

関連する問題