如果某个对象未被任何其他对象引用,则它将被.NET CLR
垃圾回收器收集.
然而,如果objA引用objB,objB引用objC和objC引用回objA,垃圾收集器如何识别出它们(作为一个整体)可以被收集?
CLR使用一种称为
标记扫描的技术.
作为这种技术的一部分,每个对象都可以被认为是最初被标记为收集的.然后,CLR通过每个可访问对象,从全局变量(静态字段等)开始,作为根,并清除每个步行对象上的标记.然后扫描剩余的标记对象.
请记住,这个“标记”是概念性的;实际上,这些对象很可能被添加到集合集中.
在循环自引用对象的情况下,不会从应用程序中找到对象的引用,因此算法将永远不会到达这些对象以“取消标记”它们.