如果某个对象未被任何其他对象引用,则它将由.NET CLR垃圾收集器收集。
但是,如果objA
引用objB
,objB
引用objC
,objC
引用回objA
,那么垃圾收集器如何弄清楚他们(作为一个整体)可以收集?
答案 0 :(得分:8)
CLR使用一种称为标记和扫描的技术。
作为此技术的一部分,可以将每个对象视为最初标记为收集。然后,CLR遍历每个可访问对象,从您的全局(静态字段等)作为根开始,并清除每个可步移对象上的标记。然后扫描剩余的标记对象。
请记住,这个“标记”是概念性的;实际上,这些对象很可能被添加到集合集中。
在循环自引用对象的情况下,不会从应用程序中找到对象的引用,因此算法永远不会到达那些对象以“取消标记”它们。
答案 1 :(得分:2)
GC包含所有已创建对象的列表。在garbarge过程中,它从全局根(如静态字段)开始,并遍历每个引用的对象。可以销毁所有未被命中的列表中的每个对象。
如果无法点击objA,objB或objC,将收集所有这些对象