【问题标题】:java memory issues when removing nodes from a tree从树中删除节点时的java内存问题
【发布时间】:2011-06-24 02:56:26
【问题描述】:

所以我了解到,在单链表中,如果删除中间的一个节点,列表的其余部分也会被垃圾回收,因为它后面的每个节点都被取消引用时会产生连锁反应。

我的问题是一棵树,其中每个节点都有对其子节点的引用以及对父节点的引用。如果我删除中间的一个节点(非叶节点)会导致内存泄漏,因为它会引用它的子节点并且他们会引用它?那么如果我想删除一个子树,我就必须从下往上删除其中的所有节点?

【问题讨论】:

    标签: java memory tree reference


    【解决方案1】:

    您应该阅读可达性的概念。它在 javadocs 中的the description of the package java.lang.ref 中定义。

    一旦一个对象不能被任何线程强访问,它就有资格进行垃圾回收。

    线程 T 强可达的对象是:

    • T的调用栈中局部变量引用的对象,
    • 任何类的静态字段引用的对象,以及
    • 对象(强)被强可达对象引用。

    如果您从您描述的树中删除一个节点(只需删除父节点上对子节点的引用),并且在您删除的节点下没有对树部分的剩余引用,那么这些对象是不强可达。即使它们形成了某种循环,JVM 也足够聪明,可以确定这些对象不是强可达的(也就是说,它们相互引用,但任何代码都无法访问它们)。因此,它们有资格进行垃圾回收。

    【讨论】:

      【解决方案2】:

      您可以删除起始节点并在其父节点中删除对该节点的引用。

      【讨论】:

      • 但是假设起始节点有一个孩子。如果我删除了起始节点,它的子节点不会仍然引用它,它不会仍然引用子节点,从而让他们两个都引用它吗?
      • 由于它们不再被任何其他引用它的类引用,它们将被释放。垃圾收集器足够聪明,可以确定这一点。
      【解决方案3】:

      要删除子树,您只需删除其父级中对它的引用。只要没有其他对它或其子代的引用,它就会被垃圾回收。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多