我有一个对象,我相信它仅由 WeakReference 持有。我已经使用 SOS 和 SOSEX 追踪了它的参考持有人,并且两者都确认是这种情况(我不是 SOS 专家,所以我在这一点上可能是错误的)。
WeakReferences 的标准解释是 GC 在扫描时会忽略它们。尽管如此,我的对象在调用 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced) 后仍然存在。
仅使用 WeakReference 引用的对象是否有可能在该集合中存在?有没有更彻底的收藏可以强制?或者,我是否应该重新审视我的信念,即对对象的唯一引用是弱的?
更新和结论
根本原因是堆栈上有一个锁定对象的引用。目前尚不清楚为什么 SOS 和 SOSEX 都没有显示该参考。用户错误总是有可能的。
在诊断根本原因的过程中,我确实做了几个实验,证明对第二代对象的弱引用可以持续很长时间。但是,WRd 2nd gen 对象将无法在 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced) 中存活。