3

重複の可能性:
弱参照

これは何のためですか?

これは、GCが早期に収集できるオブジェクトを作成する方法のようであり、早期に収集された場合は、再作成することになっています。それはキャッシュのように聞こえますが、他のStackOverflowの質問では、これはお粗末なキャッシュ戦略であると言われています。これは、GCが実際にはオブジェクトを非常に熱心かつ高速にGCするためです弱い参照はキャッシュを貧弱にするという別のQ)ASP.NETを使用するようなものですキャッシュして、非常に低いキャッシュ排除時間制限に設定します。

背景:最近、TraceSourceのCLRコードを読んでいました。コンストラクターで最初に発生するのは、WeakReference(this)が静的ディクショナリに追加されることです。奇妙なことに、TraceSourceが弱参照のディクショナリ内の各TraceSourceの構成ファイルを再読み取りする場合にのみRefreshメソッドで使用されますが、まだGCされていない場合に限ります。また、別のStackOverflowの質問は、これがメモリリークの原因であることを示しています

それ以来、WeakReferencesについて読んでいて、ますます混乱しています。

4

3 に答える 3

6

WeakReferenceは、Weakイベントを実装するためによく使用されます。イベントハンドラは、メモリリークの原因となることがよくあります。特に、複数のインスタンスがサブスクライブするイベントを伴う長期間のサービスがある場合はそうです。それらのインスタンスがイベントハンドラーの登録解除に失敗した場合(開発者がそれが重要であることに気づかなかったため、または通常のクリーンアップをトリガーしない例外ケースが原因であることが多いため)、長引く参照によってインスタンスが収集されなくなります。

もう1つの良いケースは、追加のデータを既存のインスタンスに関連付けたい場合です。たとえば、サードパーティのウィジェットに関連付けるExtraWidgetInfoがあるとします。アソシエーションを作成する1つの方法は、ディクショナリを使用することです。問題は、他の場所で使用されなくなった場合でも、すべてのウィジェットがディクショナリ自体によって存続するようになったことです。ウィジェット参照にWeakReferenceを使用すると、関連付けられたデータが、意図した有効期限を過ぎてもウィジェットを存続させないようにします。

于 2012-10-17T21:54:43.953 に答える
3

キャッシュは良い例です。キャッシュで弱参照を使用する場合、要求されていないアイテムをガベージコレクションして、メモリを再利用できます。

つまり、取得するのに便利ですが、そうでない場合は重要ではありません。

于 2012-10-17T21:19:09.273 に答える
1

GCは実行されるたびに、現在参照されていないすべてのキャッシュアイテムをクリーンアップするため、キャッシュには適していません。メモリープレッシャーなどを待ちません。キャッシュを増やすことはできません。

于 2012-10-17T21:58:40.393 に答える