3

可能重复:
弱引用

这东西是干什么用的?

这似乎是一种创建 GC 可以及早收集的对象的方法,如果它被提前收集,我应该重新创建它。这听起来像是缓存,但其他StackOverflow 问题说这是一个糟糕的缓存策略,因为实际上 GC 会非常急切和快速地 GC 你的对象,(另一个 Q 说弱引用使缓存很差)有点像使用 ASP.NET 的缓存并将其设置为非常低的缓存逐出时间限制。

背景:我最近在阅读 TraceSource 的 CLR 代码。在构造函数中,发生的第一件事是将 WeakReference(this) 添加到静态字典中。奇怪的是,只有当 TraceSource 重新读取弱引用字典中每个 TraceSource 的配置文件时,它才会在 Refresh 方法中使用,但前提是它还没有被 GC'd。另一个StackOverflow 问题表明这会导致内存泄漏

因此,从那以后我一直在阅读有关 WeakReferences 的内容,并且越来越感到困惑。

4

3 回答 3

6

WeakReference 通常用于实现弱事件。事件处理程序是内存泄漏的常见原因,特别是当您拥有一个包含多个实例订阅的事件的长期服务时。如果这些实例未能取消注册它们的事件处理程序(或者是因为开发人员没有意识到它很重要,或者通常是由于异常情况没有触发正常清理),那么延迟引用会阻止这些实例被收集。

另一个很好的情况是,如果您想将附加数据与现有实例相关联。例如,您可能有一个 ExtraWidgetInfo,您希望将其与第 3 方 Widget 相关联。创建关联的一种方法是使用字典。问题是现在所有的小部件都由字典本身保持活动状态,即使它们不再在其他任何地方使用。为 Widget 引用使用 Wea​​kReference 可以防止相关数据在 Widget 过期后保持活动状态。

于 2012-10-17T21:54:43.953 回答
3

缓存就是一个很好的例子。如果您在缓存中使用弱引用,则可以对未请求的项目进行垃圾收集以回收内存。

简而言之:任何可以方便检索的东西,但如果你不这样做并不重要。

于 2012-10-17T21:19:09.273 回答
1

当然不适合缓存,因为 GC 会在运行时清理所有当前未引用的缓存项。它不会等待内存压力或其他东西。它不允许缓存增长。

于 2012-10-17T21:58:40.393 回答