所以我们说有两个类:
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的情况下,有很多情况。如何确保它们被删除。
注意:我在网络浏览器中写了这一切,原谅任何错误
答案 0 :(得分:7)
没有。垃圾收集器不计算引用,知道对象是否可收集。如果通过来自任何根(静态变量或运行线程)的强引用链不再可访问对象,则该对象是可收集的。
答案 1 :(得分:4)
如果只引用A和B本身就是A和B,那么它们就有资格进行垃圾收集。
如果无法通过从垃圾收集根开始的链访问,则Java的GC会将对象视为有资格进行垃圾回收的对象。即使对象可能指向彼此形成一个循环,但如果它们从根部切断,它们仍然是垃圾。
答案 2 :(得分:2)
垃圾收集从活动对象的 roots 开始,因此您需要专注于这些集合。如果你有一个从活动对象引用的长链对象(当前正在使用的东西所指向的东西),那么你可以创建内存泄漏,但是如果你将引用转为null,那么对象仍然会被垃圾回收。 / p>
换句话说,如果您有A->B
和B->A
但没有指向两者,则仍会收集它们:因为无法从活动对象的根集到达它们。< / p>
根集来自程序中所有线程的集合:
http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx
和