我有一个对象,我相信只能由WeakReference持有。我使用SOS和SOSEX跟踪了它的参考持有者,两者都证实了这种情况(我不是SOS专家,所以我在这一点上可能是错的。)
WeakReferences的标准解释是GC在进行扫描时会忽略它们。尽管如此,我的对象仍然存活在GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced)的调用中。
只有WeakReference引用的对象是否可以在该集合中存活?是否有更加彻底的收藏,我可以强迫?或者,我是否应该再次访问我的观点,即对象的唯一引用是弱的?
更新和结论
根本原因是堆栈上有一个锁定对象的引用。目前尚不清楚为什么SOS和SOSEX都没有显示该参考。用户错误始终是可能的。
在诊断根本原因的过程中,我做了几个实验,证明对第二代物体的WeakReferences可以坚持很长时间。但是,WRd第二代对象将不会在GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced)中存活。
答案 0 :(得分:0)
根据维基百科“仅由弱引用引用的对象被视为无法访问(或”弱可达“),因此可以随时收集。弱引用用于避免保留由不需要的对象引用的内存”
我不确定你的案子是否与弱引用有关......
答案 1 :(得分:0)
尝试在GC.WaitForPendingFinalizers()
之后立即致电GC.Collect()
。
另一种可能的选择:不要将WeakReference
用于任何目的。在野外,我只看到它们被用作降低应用程序内存占用量的机制(即一种缓存形式)。正如强大的MSDN所说:
避免使用弱引用作为 自动解决内存问题 管理问题。相反,发展 一个有效的缓存策略 处理应用程序的对象。
答案 2 :(得分:0)
我建议您检查弱引用对象的“其他”引用。因为,如果有另一个引用仍处于活动状态,则对象将不会被GCed。
答案 3 :(得分:0)
弱引用的对象 do 被垃圾收集删除。 我有幸调试事件没有被解雇的事件系统......原来是因为订阅者只是弱引用,所以在最终的随机延迟之后GC最终会收集它。此时UI停止更新。 :)
答案 4 :(得分:0)
是的,有可能。例如,如果WeakReference
位于第二代中,而不是正在收集的第二代中,并且GC仅进行了第0代收集;它会生存。但是,它不能在完整的第二代收藏中生存并且所有终结器都在哪里运行。