【发布时间】:2013-01-22 01:23:28
【问题描述】:
在这种情况下会发生什么?即使它仍然有对树的引用,它会被收集吗?
class BinarySearchTree {
TreeNode root;
/* constructor including assigning the root*/
/* other methods of the tree */
public void example() {
root = null; /* assume the root already has children */
/* we haven't set the parent of the child of the root*/
/*to null*/
}
}
class TreeNode {
private TreeNode left;
private TreeNode right;
private TreeNode parent;
/* set and get methods */
}
【问题讨论】:
-
垃圾收集器检测到循环引用。在这种情况下,如果在树之外引用了任何节点,则整个树仍将在范围内。如果在树之外没有引用任何节点,则树将超出范围。
-
@BevynQ - 实际上,GC 不 检测循环引用。如果一个对象不可访问,则无论可能的循环引用如何,它都是不可访问的。 GC 工作基于可达性,而不是引用计数。
-
@HotLicks 这当然取决于 Java 的实现,尽管我认为它确实适用于 Oracle 当前的 SE 版本。
-
@owlstead - 我见过的每个 Sun/Oracle 版本以及 IBM 版本都是如此。有一些实验版本在一定程度上使用了引用计数等,但我不相信任何版本都成为“主流”。而且我认为纯粹的引用计数实现不会满足 Java 标准——至少必须偶尔运行可达性扫描。
标签: java tree garbage-collection binary-search-tree