据我所知,在像
Java或C#这样的托管语言中,有一种称为垃圾收集器的东西,每隔一段时间检查一次是否有任何不再引用的对象实例,因此是完全孤立的,然后清除掉记忆但是,如果程序中的任何变量都没有引用两个对象,而是相互引用(如事件订阅),则垃圾回收器将看到此引用而不清除内存中的对象.
为什么是这样?为什么垃圾收集器不能确定任何对象都不能被正在运行的程序的任何活动部分引用并处理它们.
解决方法
你的推定是不正确的.如果GC“看到”(见下文)2个或更多对象的循环引用(在“标记”阶段期间)但未被任何其他对象或永久GC句柄(强引用)引用,则将收集这些对象(在此期间) ‘清扫’阶段).
可以在this MSDN article和this blog post中找到对CLR垃圾收集器的深入了解.
注意:实际上,GC在标记阶段甚至没有“看到”这些类型的对象,因为它们无法访问,因此在扫描期间被收集.