如果某个对象未被任何其他对象引用,则该对象将由.NET CLR垃圾回收器回收。
但是,如果objA引用objB、objB引用objC和objC引用回objA,垃圾收集器如何确定它们(作为一个整体)可以被收集?
发布于 2011-12-13 20:32:10
CLR使用一种称为标记和清除的技术。
作为该技术的一部分,每个对象都可以被认为是最初标记为要收集的对象。然后,CLR遍历每个可访问的对象,从全局变量(静态字段等)开始。作为根,并清除每个可遍历对象上的标记。然后,它将扫描剩余的标记对象。
请记住,这种“标记”是概念性的;实际上,对象最有可能被添加到集合组中。
在循环自引用对象的情况下,将不会从应用程序中找到对对象的引用,因此算法永远不会到达这些对象来“取消标记”它们。
发布于 2011-12-13 20:32:10
GC有一个所有已创建对象的列表。在garbarge过程中,它从全局根(如静态字段)开始,遍历每个引用的对象。所有未命中的对象列表中的每个对象都可以被销毁。
如果无法命中objA、objB或objC,则将收集所有这些对象
https://stackoverflow.com/questions/8489241
复制相似问题