所以我了解到,如果你在中间删除一个节点,在单个链表中,列表的其余部分也将被垃圾收集,因为它会产生涟漪效应,因为它后面的每个节点都被解除引用。
我的问题是树是什么,每个节点都有对它的子节点的引用以及对父节点的引用。如果我删除中间的节点(非叶节点)会导致内存泄漏,因为它会引用它的子节点并且它们会引用它?所以,如果我想删除子树,我必须从下到上删除其中的所有节点?
答案 0 :(得分:3)
您应该阅读可达性的概念。它在the description of the package java.lang.ref中的javadoc中定义。
一旦某个对象无法被任何线程强烈访问,它就有资格进行垃圾回收。
线程T可以强烈访问的对象是:
如果从您描述的树中删除节点(只需将父节点上的引用移到子节点上),并且在您删除的节点下没有对树部分的剩余引用,那么这些对象是没有强烈的可达性。即使它们形成某种循环,JVM也足够聪明,可以确定这些对象不是很容易访问的(也就是说,它们相互引用,但任何代码都无法访问它们)。因此,他们有资格进行垃圾收集。
答案 1 :(得分:1)
您可以删除开始节点并删除其父节点中对该节点的引用。
答案 2 :(得分:0)
要删除子树,只需在其父级中删除对它的引用即可。只要没有其他引用或其子代,它就会被垃圾收集。