2009-07-08 17 views
25

.NETフレームワークのSystem.WeakReferenceクラスの有用性を理解しておりますが、実装の詳細については興味があります。.NETでのWeakReferenceの実装

WeakReferenceは.NETでどのように実装されていますか? MSDNはWeakReferenceの使い方を詳しく説明していますが、これがどのようにして動作するかについてはほとんど見ていません。

CLRはどのように参照を追跡し、GCが妨げられることなく、ターゲットが収集されたときに内部ハンドルをヌルにすることを知っていますか? CLR自体に特別な処理が必要ですか?

私の主な関心事は、標準オブジェクト参照を使用する場合とは異なるWeakReferences(特にそれらの多くを使用する場合)を使用することによるパフォーマンスの影響があるかどうかです。

+5

私はこれまで多くの研究を行ってきましたが、私の発見について詳細にブログしました。http://reedcopsey.com/?p=50 –

答えて

19

WeakReferenceクラスは、オブジェクトリファレンスをGCに渡し、ハンドルを戻します。参照を取得するか、または参照が有効かどうかを確認するたびに、ハンドルを使用してGCに参照を求める。

これは、GCがすべての弱い参照のリストを保持していることを意味します。これは、オブジェクトの収集時に更新する必要があります。また、弱参照を使用するたびにオーバーヘッドがあることを意味します。

したがって、すべての弱い参照は、ガベージコレクタのためのもう少しの作業を意味しますが、一方、それほどレギュラーな参照もそうです。もちろん、弱い参照をたくさん使うことについては注意が必要ですが、メモリ管理がオブジェクトでうまく動作するようにするには、それが引き起こす小さなオーバーヘッドに比例するはずです。

+1

これは、プロセスの基本的な説明であるため、これを答えとして設定します。ありがとうGuffa。 –

13

MSDNに言及しました。あなたはすでにこの記事を見ましたか?

http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

また、同じ著者(ジェフリー・リヒター)によって "応用Microsoft .NET Frameworkのプログラミング" の章19をチェックしてください。この章では、ガベージコレクションについて説明し、WeakReference内部についてのセクションを示します。

通常、WeakReferences内で多くのTargetsにアクセスしている場合、WeakRefはターゲットを返す前に(主にスレッドの安全性のために)何らかの処理を行うため、パフォーマンスが低下します。明らかに、オブジェクト参照を直接使うほど安価ではありません。一方、ガベージコレクタはメモリの問題が発生したときに、より多くのオプションを持つため、ラージオブジェクトへの参照を格納するときにパフォーマンスが向上します。

このトレードオフを数値化しようとしたことはありません。アプリケーションに応じて明らかに多少異なります。

+2

+1、参考資料に感謝します。ちょっと参考に、WeakReferenceのスレッド安全性には驚くほど小さなオーバーヘッドがあります。ほとんどの場合、GCHandleにオブジェクトを戻す必要があります。これは逆参照のように機能し、ヌルチェックを2回実行します。 –

+0

私は数年前にそれを見たことを思い出したと思っていましたが、本当に答える前に確認しておくべきでした。それに気づいてくれてありがとう、Reed。便利な参照資料の場合は – ars

+0

+1です。 –