Java ではfinalize
、オブジェクトがガベージ コレクションされようとしているときに (それをオーバーライドする) オブジェクトで呼び出されます。しかし、ファイナライザーがオブジェクトを再び到達可能にしたらどうなるでしょうか?
5 に答える
次に、基本的に、オブジェクトはガベージコレクションされません。これをオブジェクトの復活と呼びます。その用語で検索を実行すると、興味深い記事がたくさん表示されるはずです。Jim が述べたように、1 つの重要なポイントは、ファイナライザーが 1 回だけ実行されるということです。
オブジェクトは、再び到達不能になるまで収集されません。
JavaDocによると、 finalize() は再度呼び出されません。
API の説明を注意深く読むと、ファイナライザーがオブジェクトを再び到達可能にできることがわかります。オブジェクトは (再び) 到達不能になるまで破棄されfinalize()
ませんが、2 回以上呼び出されることはありません。
ええ、これがファイナライザーを使用しない理由です (まあ、多くの理由の 1 つです)。
このようなことを行うために作成された参照コレクションがあります。すぐに調べてここに投稿しますが、PhantomReference だと思います。
はい、PhantomReference :
ファントム参照オブジェクト。コレクターが参照先を再利用できると判断した後にキューに入れられます。ファントム参照は、Java のファイナライズ メカニズムよりも柔軟な方法で、死前のクリーンアップ アクションをスケジュールするために最もよく使用されます。
実際には、オブジェクトへの参照がこれ以上ないことを確認するために別のパスを実行します。2回目のパスでそのテストに失敗するため、オブジェクトのメモリを解放しないことになります。
finalize は特定のオブジェクトに対して 1 回だけ呼び出されるため、次に参照がない場合は、finalize を呼び出さずにメモリを解放するだけです。ファイナライズに関するいくつかの良い情報がここにあります。