垃圾收集如何收集自引用对象?

ath*_*hos 12 .net c# clr garbage-collection

如果某个对象未被任何其他对象引用,则它将由.NET CLR垃圾收集器收集.

但是,如果objA引用objB,objB引用objCobjC引用返回objA,垃圾收集器如何确定它们(作为一个整体)可以收集?

Dav*_*fer 8

CLR使用称为标记和扫描的技术.

作为该技术的一部分,可以将每个对象视为最初标记为收集.然后,CLR遍历每个可访问对象,从您的全局(静态字段等)作为根开始,并清除每个可步移对象上的标记.然后扫描剩余的标记对象.

请记住,这个"标记"是概念性的; 实际上,对象很可能被添加到集合集中.

在循环自引用对象的情况下,将不会从应用程序中找到对象的引用,因此算法将永远不会到达那些对象以"取消标记"它们.