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

bit*_*onk 8 .net garbage-collection weak-references

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

Pas*_*uoq 12

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

不要"经常"遍历列表,仅用于清理它!每个死存根只会浪费几个字的记忆.如果列表不经常使用,那么清理它的计算成本通常是不合理的,如果经常使用它,它将自己清理,如上所述.

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


Vil*_*lx- 6

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

所以,是的,你必须采用计时器的方式.

补充:您还可以查看垃圾收集通知.