.net - WeakReference.Target GC 后 WeakReference 会发生什么

标签 .net garbage-collection weak-references

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

最佳答案

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

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

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

关于.net - WeakReference.Target GC 后 WeakReference 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1813740/

相关文章:

memory-leaks - JavaFX Node 对象不被垃圾回收

haskell - 频繁的 GC 会阻止并行运行 Spark

java - JVM - WeakReferences 是否在次要 GC 中收集?

c# - 显式设置 WPF 绑定(bind)数据类型

c# - 在 WPF 文本框上调用 Select() 不执行任何操作

.net - SignalR 卡在外键上

c# - 将Datagridview的DataSource转换成List?

java - 内存不足且 CPU 消耗低

java - WeakReferences、Weakashmaps、softreferences 的用途是什么?

java - 有什么方法可以判断方法是否结束或本地方法不再使用?