删除root时的垃圾收集

时间:2013-02-11 08:29:50

标签: c# garbage-collection

我在c#中使用方法 clear()实现了二叉树,其中使根空,从而删除了对堆中根节点的引用。这使得堆中的根节点有资格进行垃圾回收。

在垃圾收集周期 只会收集根节点,然后它的两个孩子将有资格在下一个周期进行垃圾收集并采取尽可能多的周期删除树作为树的深度或将在一个周期内收集堆中的整个树

2 个答案:

答案 0 :(得分:3)

将收集整棵树,因为GC在一个循环中找到无法到达的所有对象。由于树中的所有节点都不可访问(来自某些实时根),因此应该对整个节点集进行GC。

这是GC工作的一种有效方式 - 但它也是处理自引用数据结构的好方法,例如双链表(这会导致任何未采用的算法出现问题) “考虑到某些可达根的可达性”。

答案 1 :(得分:2)

实际上,这取决于你的物体活着多久。

.NET使用名为'mark& amp;的算法扫描',描述为here。除了可以达到的内容之外,该算法基本上标记了要删除的所有内容。您的对象将在此处一次性删除。

然而,天真的标记&扫描将花费大量时间,因为大多数“长寿命”对象将在GC中存活。您拥有的寿命越长,GC标记所有对象所需的时间就越长。这就是.NET跟踪对象幸存的GC周期数的原因。如果它存活了几次,下一个GC将跳过该对象。这些被称为“世代”,在MSDN中有描述。简而言之,一个对象在GC循环中存活的次数越多,垃圾收集器访问它的频率就越低。

但是,一旦您的结构在GC标记为“未引用”的某个点上,整个结构将在一次通过中被删除。