在WeakReference.Target的GC之后,WeakReference会发生什么

时间:2009-11-28 20:44:10

标签: .net garbage-collection weak-references

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

2 个答案:

答案 0 :(得分:12)

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

不要“频繁”遍历列表,仅用于清理它!每个死存根只会浪费几个字的记忆。如果列表没有经常使用,那么清理它的计算成本通常是不合理的,如果频繁使用,它将按照上面的建议自行清理。

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

答案 1 :(得分:6)

由于您对WeakReference对象有强引用,因此不会获得GC。这也是设计原因,因为您仍然可以使用WeakReference来确定目标已经过GC。

所以是的,你必须按计时器方式进行。

已添加:您还可以查看Garbage Collection Notifications