.NET中的WeakReference实现

时间:2009-07-08 00:09:23

标签: .net reference clr reference-counting

我理解并感谢System.WeakReference类在.NET框架中的用处,但对实现细节感到好奇。

WeakReference如何在.NET中实现? MSDN详细讨论了WeakReference的用法,但是我已经看到了一些关于它如何工作的细节。

CLR如何跟踪引用并知道在收集目标时将内部句柄置空,而不会阻止GC?它是否需要CLR本身的特殊处理?

我主要担心的是使用WeakReferences(特别是如果使用其中许多)与使用标准对象引用时的性能影响是否存在。

2 个答案:

答案 0 :(得分:19)

WeakReference类将其对象引用移交给GC并获取句柄。无论何时获得引用或检查引用是否存活,都会使用句柄向GC请求引用。

这意味着GC会保留所有弱引用的列表,在收集对象时必须更新这些引用。这也意味着每次使用弱引用时都会有一些开销。

因此,每个弱引用意味着垃圾收集器的工作量更多,但另一方面,每个常规引用​​也是如此,即使它更少。你当然应该对使用大量的弱引用有点小心,但是如果你需要这样做以使内存管理能够很好地处理你的对象,那么它应该超过它所带来的小开销。

答案 1 :(得分:13)

你提到过MSDN;你已经看过这篇文章吗?

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

另请参阅同一作者(Jeffrey Richter)的“应用Microsoft .NET Framework编程”中的第19章。本章是关于垃圾收集的,有一节关于WeakReference内部。

一般情况下,如果你在WeakReferences中访问了很多Targets,那么只是因为WeakRef在返回目标之前做了一些工作(主要是为了线程安全)而导致性能下降。这显然不如直接使用对象引用那么便宜。另一方面,在存储对大对象的引用时会获得一些性能,因为当出现内存时,垃圾收集器会有更多选项。

我从未试图量化这种权衡,或者在此处知道任何参考文献。显然,它根据应用程序而有所不同。