28

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

WeakReference は .NET でどのように実装されていますか? MSDN では WeakReference の使用法について詳しく説明していますが、これが内部でどのように機能するかについて私が見た詳細はほとんどありません。

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

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

4

2 に答える 2

21

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

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

したがって、すべての弱い参照は、ガベージ コレクターの作業が少し増えることを意味しますが、一方で、すべての通常の参照も、たとえそれが少なくてもそうです。もちろん、多くの弱い参照を使用する場合は少し注意する必要がありますが、オブジェクトでメモリ管理を適切に機能させるためにそれが必要な場合は、それが引き起こす小さなオーバーヘッドを上回る必要があります。

于 2009-07-08T01:07:42.180 に答える
14

MSDNについて言及しました。この記事はもう見ましたか?

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

同じ著者 (Jeffrey Richter) による「Applied Microsoft .NET Framework Programming」の第 19 章も参照してください。この章はガベージ コレクションに関するもので、WeakReference の内部に関するセクションがあります。

一般に、WeakReferences 内で多くのアクセスを行っている場合Targets、ターゲットを返す前に WeakRef が何らかの作業 (主にスレッド セーフのため) を行うため、パフォーマンスが低下します。これは明らかに、オブジェクト参照を直接使用するほど安価ではありません。一方、大きなオブジェクトへの参照を格納する場合は、パフォーマンスがいくらか向上します。これは、メモリに関する考慮事項が発生した場合にガベージ コレクターがより多くのオプションを使用できるためです。

私はこのトレードオフを定量化しようとしたことはなく、ここでの参考文献も知りません。もちろん用途によって多少異なります。

于 2009-07-08T00:51:35.493 に答える