什么是清理二叉搜索树进行垃圾回收的最佳方法?

3

我希望清空一棵二叉搜索树以利用垃圾回收。那么,要清空一棵二叉搜索树,将根节点设置为null就足够了吗?这样会留下一堆没有指针的废弃节点吗?还是最好把每个节点都设置为null呢?

  1. 这两种方法等效吗?
  2. 它们中的哪一个会导致内存泄漏?
  3. 其中一个比另一个更快地进行垃圾回收吗?

我也关注弱引用和强引用等问题。


2
只要二叉搜索树变得不可访问,这两种情况都不应该发生。你提出的方案与利用垃圾回收器相反;这是垃圾回收器应该避免的手动内存管理方式。 - user2357112
你所说的“将根节点设置为null”是什么意思?如果是将所有跟踪BST的引用都设置为null,那么是足以触发GC的。不过我不确定性能如何,你可以进行测试。 - kiruwka
简洁而正确,重复内容在这里。 只需将根节点设置为null即可。整个树变得不可达,从而可以进行垃圾回收。 - Robert Harvey
@KatedralPillon:bst = null 就可以了,如果 bst 变量超出作用域,则不需要这样做。 - user2357112
1
@KatedralPillon:或者你是在说从BST中删除所有元素,然后继续使用它,添加新元素吗?在这种情况下,它可能看起来像root = null,具体取决于你的BST的结构。通常最好用一个新的BST来替换它;例如,如果你在循环体的开头有BST bst = new BST();,那么你每次迭代都会使用一个全新的BST,旧的BST只要不再需要就会被GC回收。 - user2357112
显示剩余2条评论
1个回答

1
任何无法被任何活动线程访问的对象都将有资格进行垃圾回收。
基于此:
  1. 是。
  2. 否。
  3. 取决于GC的实现。无论如何,作为Java程序员,您无法控制它。您所能做的就是相信它会很好地完成其工作。此外,将根设置为null的时间复杂度为O(1),而将所有引用设置为null的时间复杂度为O(n),其中n是节点数。
结论:
只需将根设置为null,并在适当时候让GC遍历树即可 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接