こんにちは、ファントム参照について 1 つ疑問があります。私が理解しているのは、オブジェクトがガベージ コレクションに向かう直前に finalize メソッドが呼び出されることです。ただし、オブジェクトがガベージ コレクションの対象でない場合、finalize メソッドは実行されません。
この finalize メソッドが呼び出されるときのファントム参照について話します。
ファイナライズは常にファントム参照で呼び出されます。
私はこれについて非常に混乱しています。私を助けてください。
こんにちは、ファントム参照について 1 つ疑問があります。私が理解しているのは、オブジェクトがガベージ コレクションに向かう直前に finalize メソッドが呼び出されることです。ただし、オブジェクトがガベージ コレクションの対象でない場合、finalize メソッドは実行されません。
この finalize メソッドが呼び出されるときのファントム参照について話します。
ファイナライズは常にファントム参照で呼び出されます。
私はこれについて非常に混乱しています。私を助けてください。
ファントム参照があるかどうかに関係なく、ファイナライザーが呼び出されることは保証されません。コードの重要な部分でファイナライザーに依存しないでください。ファイナライザーがタイムリーに呼び出されるという保証はなく、実際にはまったく呼び出されないからです。
多くの人は、正しく使用するのが非常に難しいため、ファイナライザーをまったく使用しないでくださいと主張しています。
オブジェクトがファントム参照を介してのみ使用可能になると、最初のGCfinalize()
メソッドが呼び出された後、2番目のGCの後に参照がキューに入れられます。その後、ファントム参照がクリーンアップされた場合(またはそれ自体が使用できなくなった場合)、3番目のGCの後にメモリがクリアされます。
Finalize は、予期したときに常に呼び出されますが、必ずしも呼び出されるわけではありません。JVM のシャットダウン時にのみ呼び出しが行われる場合があります (単純にプログラムを強制終了しないと仮定します)。finalize()
重要な仕事をするために頼るべきではありません。finalize()
しかし、有用な関数を実装して呼び出しを含めることも良い習慣super.finalize()
です。