Ree*_*sey 27 .net clr reference reference-counting
我理解并欣赏.NET框架中System.WeakReference类的用处,但我对实现细节很好奇.
WeakReference是如何在.NET中实现的?MSDN详细讨论了WeakReference的用法,但是我已经看到了一些关于它如何工作的细节.
CLR如何跟踪引用并知道在收集目标时将内部句柄清空,而不会阻止GC?它是否需要CLR本身的特殊处理?
我主要担心的是,使用WeakReferences(特别是如果使用其中许多)与使用标准对象引用时的性能有关.
Guf*_*ffa 20
WeakReference类将其对象引用移交给GC并获取句柄.每当您获得引用或检查引用是否存活时,句柄用于向GC请求引用.
这意味着GC会保留所有弱引用的列表,它必须在收集对象时更新.这也意味着每次使用弱引用时都会有一些开销.
因此,每个弱引用意味着垃圾收集器的工作量更多,但另一方面,每个常规引用也是如此,即使它更少.您当然应该对使用大量弱引用有点小心,但是如果您需要使用它来使内存管理与您的对象一起使用,那么它应该超过它导致的小开销.
ars*_*ars 13
你提到过MSDN; 你看过这篇文章吗?
http://msdn.microsoft.com/en-us/magazine/bb985011.aspx
另请参阅同一作者(Jeffrey Richter)的"应用Microsoft .NET Framework编程"中的第19章.本章介绍垃圾收集,并有一节关于WeakReference内部.
一般来说,如果你Targets在WeakReferences中访问了很多内容,那么就会因为WeakRef在返回目标之前做了一些工作(主要是为了线程安全)而导致性能下降.这显然不如直接使用对象引用那么便宜.另一方面,在存储对大对象的引用时会获得一些性能,因为当出现内存时,垃圾收集器会有更多选项.
我从来没有尝试量化这种权衡,或者在这里知道任何参考文献.显然,它根据应用程序而有所不同.