对象引用和垃圾收集

object reference and garbage collection

当代码有以下关系时,如果断开A和B的连接,B和C会被垃圾回收吗?为什么?谢谢

class A{
    B b;
    A(B b);
}

class B{
    C c;
    B(C c);
}

class C{
    C();
}

class TestTarget{
    public void test{
    c = new C;
    b = new B(c);
    a = new A(b); 
    a = null;
    }
}

一般来说,如果您询问 组合 和 GC,即 ABBC然后,当您设置 instanceOfA==nullinstanceOfA 时,instanceOfBinstanceOfC 符合 GC 条件,前提是它们未被任何地方引用(假设参考文献没有泄露

不,它们不会被垃圾回收,因为您还有其他指向它们的活动变量。 如果您也将它们设置为 null (b = null, c=null) 它们可以被垃圾回收。

如果存在上述场景的工作代码,那么是的,B和C将被GC收集。因为没有来自C的传出引用,也没有对B的传入引用,但是B和C之间存在关系。所以GC不会立即收集B和C的对象。在达到阈值 GC 周期数后,将收集这些对象。

C和B的对象将被GC。如果在 a 设置为 NULL 后进行堆转储。 heapdump 将包含 B 和 C 的对象,但如果您排除 soft/weak/phantom 这些对象的引用,那么您将看不到任何强引用,这意味着这些对象有资格进行垃圾回收。