【问题标题】:What happens to a WeakReference after GC of WeakReference.TargetWeakReference.Target GC 后 WeakReference 会发生什么
【发布时间】:2009-11-28 20:44:10
【问题描述】:

当 WeakReference.Target 引用的目标对象被垃圾回收后,WeakReference 会发生什么? WeakRerence 是否保持活力并保持存在? 我问的原因是我有一个存储在列表中的弱引用列表。在运行时,新的 WeakReferences 不断被添加到该列表中。现在当目标对象死亡时,我必须自己清理废弃的 WeakReference 吗? 如果是这样,是否有一个聪明的技巧可以做到这一点?当 WeakReference 被废弃时,我能收到通知吗?还是我必须引入一个经常循环遍历该列表的计时器,以查看是否可以从该列表中删除任何 WeakReference 实例。

【问题讨论】:

  • 顺便说一句,问题的措辞做得很好,尽管我几乎没有使用 .net 的经验,但我觉得很清楚问题出在哪里。

标签: .net garbage-collection weak-references


【解决方案1】:

这是弱引用的常见问题。引用本身保持活动状态,因为它具有指向它的正常指针。正如您所建议的,您需要不时进行一些“手动垃圾收集”。请注意,当您出于其他原因遍历列表时,您可能会在途中清理存根。根据列表的使用模式,这种“侧面”垃圾收集可能就足够了。

不要为了清理它而“经常”循环列表!每个死存根只会浪费几个单词的内存。如果列表不经常使用,那么清理它的计算成本通常是不合理的,如果经常使用它,它会按照上面的建议自行清理。

它完全在另一个垃圾收集系统中,但问题非常相似,如果你能得到它,你可能会对this article感兴趣。

【讨论】:

  • 如果列表不会被索引访问,最好的策略可能是在添加项目时清除它,如果在最后一次清除和最后一次集合之间添加的项目数(使用GC 计数器)超过列表大小的一定比例。重要的通常不是所有垃圾都被清理干净,而是不符合立即收集条件的垃圾数量仍然有限。顺便说一句,WeakReferences 的成本比“几句话”还多。它们并不昂贵,但即使是一百万个未使用的弱 ref 也会使程序窒息。
【解决方案2】:

由于你对 WeakReference 对象有一个强引用,它不会被 GC'ed。这也是设计使然,因为您仍然可以使用 Wea​​kReference 找出目标已被 GC 处理。

所以是的,你必须使用计时器。

补充:你也可以看看Garbage Collection Notifications

【讨论】:

  • +1,但我会提醒您不要使用 GC 通知,因为它们会禁用 GC 的一些较新(好的)功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2019-10-16
  • 1970-01-01
  • 2016-07-08
  • 2010-11-28
  • 1970-01-01
  • 2015-10-17
相关资源
最近更新 更多