オブジェクトがFinalizeメソッドを実装していて、その内部にアプリケーションの生きている静的オブジェクトを指しているとします(デザインは悪いですが、非常に可能です)。到達可能であると判断された場合、FReachableオブジェクトはどうなりますか?
ここで、GCは、オブジェクトをファイナライズキューに入れてオブジェクトをファイナライズし、そのオブジェクトをfinalizeメソッドを呼び出すためのFReachableキューに移動します。
しかし、そのオブジェクトが参照している生きているオブジェクトが見つかるので、GCはそのオブジェクトが占めていたメモリを再利用することができず、再びそのオブジェクトにマークを付けます。ゾンビオブジェクト!
この時点で、このオブジェクトはどこにありますか?
- freachableに残りますか?
- ファイナライズキューに残りますか?
- 不確定な状態(フレキシブルキューとファイナンシゼーションキューから削除)で管理されたヒープ上に残りますか?
また、このようなオブジェクトのReRegisterForFinalize()に最適な場所は何ですか?
こんにちはThxの答えです。それはファイナライズと解放可能なキューから削除されているが、管理されたヒープに残っていると言っていますか? –
はい。ファイナライザのヒープ上に残り、次のGC.Collect()でのみ削除されます。まだ到達できない場合。 –
こんにちはヘンク、何が私を混乱させるのか見てみましょう。あなたはファイナライザの間にヒープに残っていると言いました....しかしファイナライザの後にどこに残っているのか聞いていますか? –