对象引用和垃圾收集
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,即 A
有 B
和 B
有 C
然后,当您设置 instanceOfA==null
、instanceOfA
时,instanceOfB
和 instanceOfC
将 符合 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 这些对象的引用,那么您将看不到任何强引用,这意味着这些对象有资格进行垃圾回收。
当代码有以下关系时,如果断开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,即 A
有 B
和 B
有 C
然后,当您设置 instanceOfA==null
、instanceOfA
时,instanceOfB
和 instanceOfC
将 符合 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 这些对象的引用,那么您将看不到任何强引用,这意味着这些对象有资格进行垃圾回收。