所以我了解到,在单链表中,如果您删除中间的一个节点,列表的其余部分也将被垃圾收集,因为当它后面的每个节点都被取消引用时会产生链式 react 。
我的问题是,对于一棵树来说,每个节点都有对其子节点的引用以及对父节点的引用。如果我删除中间的一个节点(非叶节点)是否会导致内存泄漏,因为它会引用它的子节点并且它们会引用它?因此,如果我想删除一个子树,我必须从下往上删除其中的所有节点吗?
请您参考如下方法:
您应该阅读有关可达性 的概念。它在 javadocs 中定义,在 the description of the package java.lang.ref 中.
一旦一个对象不能被任何线程强访问,它就有资格被垃圾收集。
线程 T 强可达的对象是:
- T的调用栈中局部变量引用的对象,
- 任何类的静态字段引用的对象,以及
- 对象(强地)被强可达对象引用。
如果您从您描述的树中删除一个节点(简单地通过删除父节点上对子节点的引用),并且没有剩余的对您删除的节点下的树部分的引用,那么这些对象是不可达。即使它们形成了某种循环,JVM 也足够聪明地确定这些对象不是强可达的(即它们相互引用,但任何代码都无法到达它们)。因此,它们有资格进行垃圾回收。