为什么垃圾收集器无法确定引用彼此的对象何时是孤立的

Eri*_*tas 6 c# garbage-collection

据我所知,在像Java或C#这样的托管语言中,有一种称为垃圾收集器的东西,每隔一段时间检查一次是否有任何不再引用的对象实例,因此是完全孤立的,然后清除掉记忆 但是,如果程序中的任何变量都没有引用两个对象,而是相互引用(如事件订阅),则垃圾回收器将看到此引用而不清除内存中的对象.

为什么是这样?为什么垃圾收集器不能确定任何对象都不能被正在运行的程序的任何活动部分引用并处理它们.

Jas*_*son 24

你的推定是不正确的.如果GC"看到"(见下文)2个或更多对象的循环引用(在"标记"阶段期间)但未被任何其他对象或永久GC句柄(强引用)引用,则将收集这些对象(在此期间) '清扫'阶段).

可以在此MSDN文章此博客文章中找到有关CLR垃圾收集器的深入介绍.

注意:实际上,GC在标记阶段甚至没有"看到"这些类型的对象,因为它们无法访问,因此在扫描期间被收集.


Dav*_*eas 7

大多数GC不再使用引用计数.它们通常(在Java和.NET中都是这种情况)使用来自根对象的可达性.对象的根集是全局变量和堆栈引用的实例.直接或间接从该集合可以到达的任何东西都是活着的.内存的其余部分无法访问,因此容易被收集.