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

时间:2013-06-08 20:52:40

标签: java memory-management garbage-collection

所以我们说有两个类:

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;
    }
}

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

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

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

注意:我在网络浏览器中写了这一切,原谅任何错误

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

如果只引用A和B本身就是A和B,那么它们就有资格进行垃圾收集。

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

答案 2 :(得分:2)

垃圾收集从活动对象的 roots 开始,因此您需要专注于这些集合。如果你有一个从活动对象引用的长链对象(当前正在使用的东西所指向的东西),那么你可以创建内存泄漏,但是如果你将引用转为null,那么对象仍然会被垃圾回收。 / p>

换句话说,如果您有A->BB->A但没有指向两者,则仍会收集它们:因为无法从活动对象的根集到达它们。< / p>

根集来自程序中所有线程的集合:

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

What are the roots?