2013-02-11 88 views
4

我有一个在c#中用一个方法实现的二叉树clear()其中使根null,从而删除对堆中根节点的引用。这使得堆中的根节点符合垃圾回收的条件。垃圾收集周期将仅根节点收集,然后它的两个孩子将有资格在下一周期的垃圾收集,并采取尽可能多的周期来去除树的深度时删除根垃圾回收

或将堆中的整棵树在一个周期内收集到

回答

3

整个树将被收集,因为GC在一个周期内找到所有无法到达的对象。由于您的树中没有任何节点可以访问(来自某个活根),因此应该对整个节点集进行GC处理。

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

2

其实这取决于你的对象已经活了多久。

.NET使用名为'mark & sweep'的算法,其描述为here。该算法基本上标记了除去的所有东西,除了可以达到的东西外。您的对象将在此迭代中被删除。

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

但是,一旦您的结构在某些点被GC标记为“未引用”,那么整个结构将被一次性删除。