1

オブジェクトが Finalize メソッドを実装しているが、その内部でアプリケーションの有効な静的オブジェクトを参照しているとします (設計は悪いですが、非常に可能性があります)。

ここで、GC が開始され、オブジェクトをファイナライズ キューに入れてファイナライズし、FReachable キューに移動してファイナライズ メソッドを呼び出します。

しかし、おっ!生きているオブジェクトを参照していることがわかるため、GC がオブジェクトによって占有されているメモリを再利用できず、オブジェクトが再び生きているとマークされます。ゾンビのオブジェ!

この時点で、このオブジェクトはどこにありますか?

  1. Freachable のままですか?
  2. ファイナライズ キューに残っていますか?
  3. 不確定な状態でマネージド ヒープに残る (freachable およびファイナライズ キューから削除される)?

また、そのようなオブジェクトの ReRegisterForFinalize() に最適な場所は何ですか?

4

1 に答える 1

1

生きているオブジェクトを参照していることがわかります

それは問題ではありません。発信参照は GC には関係ありません。

もう 1 つのシナリオは、ファイナライズ中のオブジェクトがルート化されたリストに自分自身を登録することによって、自分自身を再び到達可能にする場合です。

これを復活といいます。GC から特別な注意を払う必要はありません。ファイナライザーが処理され、参照が fReachable から削除されます。特別なことは何もないことに注意してください。fReachable のオブジェクトは、いつでも不確定な状態ではありません。次の GC コレクションで再スキャンする必要があります。ファイナライザーのコストの 1 つは、2 ラウンドの GC が必要なことです。

通常、オブジェクトはReRegisterForFinalize(this)復活するときに呼び出します。
しかし、復活は一般的な慣習とはかけ離れていることに注意してください。

于 2011-07-09T11:43:39.853 に答える