2011-07-09 6 views
1

オブジェクトがFinalizeメソッドを実装していて、その内部にアプリケーションの生きている静的オブジェクトを指しているとします(デザインは悪いですが、非常に可能です)。到達可能であると判断された場合、FReachableオブジェクトはどうなりますか?

ここで、GCは、オブジェクトをファイナライズキューに入れてオブジェクトをファイナライズし、そのオブジェクトをfinalizeメソッドを呼び出すためのFReachableキューに移動します。

しかし、そのオブジェクトが参照している生きているオブジェクトが見つかるので、GCはそのオブジェクトが占めていたメモリを再利用することができず、再びそのオブジェクトにマークを付けます。ゾンビオブジェクト!

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

  1. freachableに残りますか?
  2. ファイナライズキューに残りますか?
  3. 不確定な状態(フレキシブルキューとファイナンシゼーションキューから削除)で管理されたヒープ上に残りますか?

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

答えて

1

それはその問題ではない生きているオブジェクト

を参照検索します。発信参照はGCとは無関係です。

もう1つのシナリオは、ファイナライズするオブジェクトがルートリストに登録することによって、再び到達可能になるシナリオです。

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

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

+0

こんにちはThxの答えです。それはファイナライズと解放可能なキューから削除されているが、管理されたヒープに残っていると言っていますか? –

+0

はい。ファイナライザのヒープ上に残り、次のGC.Collect()でのみ削除されます。まだ到達できない場合。 –

+0

こんにちはヘンク、何が私を混乱させるのか見てみましょう。あなたはファイナライザの間にヒープに残っていると言いました....しかしファイナライザの後にどこに残っているのか聞いていますか? –

関連する問題