从树中删除节点时出现java内存问题

时间:2011-06-23 17:52:02

标签: java memory tree reference

所以我了解到,如果你在中间删除一个节点,在单个链表中,列表的其余部分也将被垃圾收集,因为它会产生涟漪效应,因为它后面的每个节点都被解除引用。

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

3 个答案:

答案 0 :(得分:3)

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

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

线程T可以强烈访问的对象是:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

相关问题