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

时间:2011-12-13 12:27:58

标签: c# .net garbage-collection clr

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

但是,如果objA引用objBobjB引用objCobjC引用回objA,那么垃圾收集器如何弄清楚他们(作为一个整体)可以收集?

2 个答案:

答案 0 :(得分:8)

CLR使用一种称为标记和扫描的技术。

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

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

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

答案 1 :(得分:2)

GC包含所有已创建对象的列表。在garbarge过程中,它从全局根(如静态字段)开始,并遍历每个引用的对象。可以销毁所有未被命中的列表中的每个对象。

如果无法点击objA,objB或objC,将收集所有这些对象