8

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

4

2 回答 2

12

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

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

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

于 2009-11-28T21:06:23.613 回答
6

由于您对 WeakReference 对象有强引用,因此它不会被 GC 处理。这也是设计使然,因为您仍然可以使用 Wea​​kReference 来发现目标已被 GC 处理。

所以是的,你必须走计时器的方式。

补充:你也可以看看垃圾收集通知

于 2009-11-28T20:48:39.387 回答