12

我有一个对象,我相信它仅由 WeakReference 持有。我已经使用 SOS 和 SOSEX 追踪了它的参考持有人,并且两者都确认是这种情况(我不是 SOS 专家,所以我在这一点上可能是错误的)。

WeakReferences 的标准解释是 GC 在扫描时会忽略它们。尽管如此,我的对象在调用 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced) 后仍然存在。

仅使用 Wea​​kReference 引用的对象是否有可能在该集合中存在?有没有更彻底的收藏可以强制?或者,我是否应该重新审视我的信念,即对对象的唯一引用是弱的?

更新和结论

根本原因是堆栈上有一个锁定对象的引用。目前尚不清楚为什么 SOS 和 SOSEX 都没有显示该参考。用户错误总是有可能的。

在诊断根本原因的过程中,我确实做了几个实验,证明对第二代对象的弱引用可以持续很长时间。但是,WRd 2nd gen 对象将无法在 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced) 中存活。

4

5 回答 5

0

根据维基百科“仅由弱引用引用的对象被认为是不可达的(或“弱可达的”),因此可以随时收集。弱引用用于避免保持不需要的对象引用的内存“

我不确定您的案例是否与弱引用有关...

于 2010-04-20T02:34:45.490 回答
0

GC.WaitForPendingFinalizers()尝试在 之后立即调用GC.Collect()

另一种可能的选择:永远不要将 aWeakReference用于任何目的。在野外,我只见过它们用作降低应用程序内存占用的机制(即一种缓存形式)。正如强大的MSDN所说:

避免使用弱引用作为内存管理问题的自动解决方案。相反,开发一个有效的缓存策略来处理您的应用程序的对象。

于 2010-04-20T02:43:32.233 回答
0

我建议您检查对弱引用对象的“其他”引用。因为,如果还有另一个引用仍然存在,则不会对对象进行 GC。

于 2012-09-24T20:55:13.237 回答
0

弱引用的对象确实会被垃圾收集删除。我很高兴调试没有触发事件的事件系统......原来是因为订阅者只是被弱引用,所以在一些最终的随机延迟之后,GC 最终会收集它。此时 UI 停止更新。:)

于 2014-12-06T07:40:01.537 回答
0

对的,这是可能的。如果WeakReference位于被收集的那一代之外的另一代,例如,如果它在 2nd Generation 中,则 GC 只进行 Gen 0 收集;它会存活下来。但是,它不应该在完成并且所有终结器都运行的完整第二代集合中存活下来。

于 2019-08-09T18:45:45.067 回答