2

所以可以说有两个类:

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。如何确保它们被删除。

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

4

3 回答 3

8

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

于 2013-06-08T20:56:24.923 回答
6

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

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

于 2013-06-08T20:55:22.323 回答
2

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

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

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

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

根源是什么?

于 2013-06-08T20:57:07.917 回答