2

在这种情况下会发生什么?即使它仍然有对树的引用,它会被收集吗?

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 */
}
4

4 回答 4

4

垃圾收集器从“根”开始。这些将是由 JVM 锚定的几个表以及所有线程的所有堆栈帧中的所有引用。每个“根”引用都被“跟踪”到它所寻址的任何对象,并且该对象被添加到可访问但未跟踪的对象列表中。

在跟踪根之后,一次检查一个可达但未跟踪的对象列表,并且这些对象中的引用被“跟踪”到其他对象,这些对象又被添加到列表中。

一旦对象被跟踪,就会从列表中删除。在跟随参考时到达并且结果已经被触摸的对象不会添加到列表中。

最终,可到达但未跟踪的对象列表变为空,此时“标记”阶段完成。然后是“扫描”阶段——所有对象都被扫描,任何没有到达的都被丢弃。

当然,这是一个过度简化的 GC 版本,但它几乎涵盖了所有内容。如上所述无法“到达”的对象将被“收集”并将其空间返回到可用空间池。

于 2013-01-22T01:41:14.820 回答
3

垃圾收集器将收集任何无法访问的对象。IOW,没有任何迹象表明它。它指向自己的内容无关紧要。

于 2013-01-22T01:28:27.900 回答
1

它将被删除垃圾收集器收集每个没有引用它的对象,这意味着你根本无法访问它

于 2013-01-22T01:28:57.597 回答
0

在没有看到您实际如何填充树的情况下,答案是“视情况而定”。作为一般规则,如果将来无法访问该变量,则将其称为对象并且 gc 会处理它。但是,如果您的树以您以后可以引用子节点的方式设置(例如,如果它们具有实际的变量名称),那么 gc 将无济于事。

于 2013-01-22T01:29:40.990 回答