当代码具有以下关系时,如果从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;
}
}
答案 0 :(得分:1)
C和B的对象将是GC。如果在a设置为NULL后进行堆转储。 heapdump将具有B和C的对象,但是如果你排除这些对象的soft / weak / phantom引用,那么你就看不到任何强引用,这意味着这些对象有资格进行垃圾收集。
答案 1 :(得分:0)
一般情况下,如果您询问组合和GC,A
有B
而B
有C
那么,当您设置时instanceOfA==null
,instanceOfA
,instanceOfB
和instanceOfC
将符合GC 条件,前提是它们未在任何地方引用(假设参考文献没有泄漏)
答案 2 :(得分:0)
不,他们不会被垃圾收集,因为你还有其他指向他们的实时变量。 如果你也将它们设置为null(b = null,c = null),它们可以被垃圾收集。
答案 3 :(得分:0)
如果存在上述场景的工作代码,则GC将收集是B和C.由于没有来自C的传出引用而没有对B的传入引用,但是B和C之间存在关系。因此GC不会立即收集B和C的对象。在GC周期的阈值数量之后,将收集这些对象。