12

WeakReference によってのみ保持されていると思われるオブジェクトがあります。私は SOS と SOSEX を使用してその参照所有者を追跡しましたが、どちらもこれが事実であることを確認しました (私は SOS の専門家ではないため、この点で間違っている可能性があります)。

WeakReferences の標準的な説明は、GC がスイープを行うときにそれらを無視するというものです。それにもかかわらず、私のオブジェクトは GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced) の呼び出しに耐えます。

WeakReference でのみ参照されるオブジェクトがそのコレクションを生き残ることは可能ですか? 私が強制できるさらに完全なコレクションはありますか? それとも、オブジェクトへの唯一の参照が弱いという私の信念を再検討する必要がありますか?

更新と結論

根本的な原因は、オブジェクトをロックしている参照がスタックにあったことです。なぜ SOS も SOSEX もその参照を示さなかったのかは不明です。ユーザーエラーは常に可能性があります。

根本原因を診断する過程で、私はいくつかの実験を行い、第 2 世代オブジェクトへの WeakReferences が驚くほど長い間存続できることを実証しました。ただし、WRd 第 2 世代オブジェクトはGC.Collect(GC.MaxGeneration, GCCollectionMode.Forced) では存続しません。

4

5 に答える 5

0

GC.WaitForPendingFinalizers()直後に電話してみてくださいGC.Collect()

WeakReference別の可能なオプション:いかなる目的にも使用しないでください。実際には、アプリケーションのメモリフットプリントを下げるためのメカニズム(つまり、キャッシュの形式)として使用されるのを見たことがあります。強力なMSDNが言うように:

メモリ管理の問題の自動解決策として弱参照を使用することは避けてください。代わりに、アプリケーションのオブジェクトを処理するための効果的なキャッシュポリシーを開発してください。

于 2010-04-20T02:43:32.233 に答える
0

ウィキペディアによると、「弱い参照によってのみ参照されるオブジェクトは、到達不能(または「弱い到達可能」)と見なされるため、いつでも収集される可能性があります。弱い参照は、不要なオブジェクトによってメモリが参照されたままになるのを避けるために使用されます」

あなたのケースが弱い参照に関するものかどうかはわかりません...

于 2010-04-20T02:34:45.490 に答える
0

弱く参照されているオブジェクトへの「その他」の参照を確認することをお勧めします。別の参照がまだ生きている場合、オブジェクトは GC されないためです。

于 2012-09-24T20:55:13.237 に答える
0

弱く参照されたオブジェクト、ガベージ コレクションによって削除されます。イベントが発生しないイベント システムをデバッグする喜びがありました...サブスクライバーが弱く参照されただけであり、最終的にランダムな遅延が発生した後、GC が最終的にそれを収集するためであることが判明しました。その時点で UI の更新が停止しました。:)

于 2014-12-06T07:40:01.537 に答える