对象可以通过相互引用使彼此"不可删除"吗?

sin*_*inθ 2 java garbage-collection memory-management

所以我们说有两个类:

public class A {
    B reference = new B(this) //B isn't garbage collected because A references it
}

public class B {
    A reference // A isn't garbage collected because B references it
    public B(A ref) {
      reference = ref;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后第三个类创建一个新A对象.然后,当它想要骑它时,它将指针设置为null.不会有由A和B引起的一些奇怪的持续循环,因为它们都互相引用吗?两者都不能被收集,因为它们让对方"活着".或者JVM是否太聪明,并意识到程序的其余部分不知道它们?

感觉这可能会导致某种内存泄漏.

如果可以,你如何解决?双向引用在代码中非常常见.在对象1知道对象2并且对象2知道对象1的情况下,有很多情况.如何确保它们被删除.

注意:我在我的网络浏览器中写了所有这些,所以原谅任何错误

JB *_*zet 7

不是.垃圾收集器不计算引用,知道对象是否可收集.如果通过来自任何根(静态变量或运行线程)的强引用链不再可访问对象,则该对象是可收集的.


NIN*_*OOP 5

如果仅对 A 和 B 的引用是 A 和 B 本身,则它们有资格进行垃圾收集。

如果无法通过从垃圾收集根开始的链访问对象,Java 的 GC 会认为对象有资格进行垃圾收集。即使对象可能相互指向以形成一个循环,但如果从根上切断它们,它们仍然是垃圾。