8

WeakReference.Target によって参照されるターゲット オブジェクトがガベージ コレクションされると、WeakReference はどうなりますか? WeakRerence は存続し、存在し続けますか? 私が尋ねている理由は、リストに格納されている WeakReferences のリストがあるからです。実行時に、新しい WeakReferences が常にそのリストに追加されます。ターゲット オブジェクトが死んだら、放棄された WeakReference を自分でクリーンアップする必要がありますか? もしそうなら、これを行うための巧妙なトリックはありますか? WeakReference が放棄されたときに通知を受け取ることはできますか? または、そのリストを頻繁にループするタイマーを導入して、そのリストから WeakReference インスタンスを削除できるかどうかを確認する必要がありますか。

4

2 に答える 2

12

これは弱参照でよくある問題です。参照自体は通常のポインタを持っているため、生きたままです。あなたが提案するように、時々「手動ガベージコレクション」を行う必要があります。別の理由でリストをトラバースしているときに、おそらく途中でスタブをクリーンアップできることに注意してください。リストの使用パターンによっては、この「サイド」ガベージ コレクションで十分な場合もあります。

リストをクリーンアップするためだけに、リストを「頻繁に」ループしないでください。それぞれのデッド スタブは、数語のメモリを浪費するだけです。リストが頻繁に使用されない場合、クリーニングの計算コストは​​正当化されないことが多く、頻繁に使用される場合は、上記のように自動的にクリーンアップされます。

これは完全に別のガベージ コレクション システムにありますが、問題は非常に似ているため、入手できればこの記事に興味があるかもしれません。

于 2009-11-28T21:06:23.613 に答える
6

WeakReference オブジェクトへの強い参照があるため、GC されません。これも設計によるものです。これは、WeakReference を引き続き使用して、ターゲットが GC されていることを確認できるようにするためです。

そうです、あなたはタイマーの道を行かなければなりません。

追加: Garbage Collection Notificationsも参照してください。

于 2009-11-28T20:48:39.387 に答える