3

私は finalize() メソッドについて読んでいて、興味がありました:

ファイナライズでオブジェクトをクリーンアップする (それらを NULL に設定する) タスクと、メモリからオブジェクトを削除するタスクの違いは何ですか?

4

3 に答える 3

10

ファイナライズでオブジェクトをクリーンアップする(NULLに設定する)タスクの違いは何ですか

nullに設定すると、オブジェクトへの1 つの参照が削除されます。オブジェクトへの参照がこれ以上存在しない場合、ガベージコレクターはオブジェクトを削除できます (必須ではありません)。

メモリからオブジェクトを削除しますか?

Java でオブジェクトを削除 (破棄、削除) する明示的な方法はありません。ガベージコレクターは好きなときにそれを行います。特に、最後の参照を削除してからオブジェクトを削除/破棄するまでの時間は無期限です

finalizeメソッドでnullへの参照を設定する必要はありません。ガベージ コレクターの呼び出しがオブジェクトをファイナライズすると、その参照はとにかくすぐになくなります。

非常に長い Java 経験の中で、独自の finalize メソッドを作成したことはありません。

オブジェクトが os-resources を処理している場合、独自の finalize メソッドを作成することが理にかなっているまれなケースが発生します。ただし、一般に、OS アクセスには標準パッケージを使用します。

于 2012-06-16T18:09:50.160 に答える
1

に設定したときにオブジェクトを「クリーンアップ」しませんnull。参照を null に設定しているだけです。次のことを考慮してください。

Object a = new Object();
Object b = a;
a = null;
System.out.println(b);

オブジェクトがすべての参照を失うと、次の GC パスで収集されます。Finalize は、これが発生したときに呼び出されるメソッドであり、使用を避ける必要があります

余分な参照を保持しないで、GC に任せてください。

于 2012-06-16T17:56:18.127 に答える
0

finalize() は、オブジェクトの参照がなくなると、ガベージ コレクターによって呼び出されます。これをオーバーライドできます。ベスト プラクティスは、それを try-catch-finally ブロックで使用して、ファイルなどの Java 以外のリソースを解放することです。とにかく、このように使用する場合は、クラス階層のファイナライズを確実にするために super.finalize() も呼び出す必要があります。

このメソッドは常に高度な用途向けであり、通常のプロダクション コードでは使用しないでください。それらのリソースを使用するメソッドの finally 句でリソースを解放します。

于 2012-06-16T17:47:11.940 に答える