对象引用和垃圾收集

时间:2015-04-28 06:08:41

标签: java jvm

当代码具有以下关系时,如果从B断开A,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;
    }
}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

一般情况下,如果您询问组合和GC,ABBC那么,当您设置时instanceOfA==nullinstanceOfAinstanceOfBinstanceOfC符合GC 条件,前提是它们未在任何地方引用(假设参考文献没有泄漏

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果存在上述场景的工作代码,则GC将收集是B和C.由于没有来自C的传出引用而没有对B的传入引用,但是B和C之间存在关系。因此GC不会立即收集B和C的对象。在GC周期的阈值数量之后,将收集这些对象。