Java 初始化对象内部的垃圾收集
我有一个简单的场景,其中一个对象在另一个对象中初始化。我想了解,若外部对象是垃圾收集的,那个么内部对象也是垃圾收集的吗 例如:Java 初始化对象内部的垃圾收集,java,garbage-collection,Java,Garbage Collection,我有一个简单的场景,其中一个对象在另一个对象中初始化。我想了解,若外部对象是垃圾收集的,那个么内部对象也是垃圾收集的吗 例如: Class A { private String id; private B b = new B(); //Note Here public void doOperationOnB(){ //operations on object B } //NO getter/setter to object B //sett
Class A {
private String id;
private B b = new B(); //Note Here
public void doOperationOnB(){
//operations on object B
}
//NO getter/setter to object B
//setter/getter for id
}
Class B {
private String id;
//setter/getter for id
}
public static void main(){
A a = new A(); //initialization
a.doOperationOnB();
a = null;
}
如果a是垃圾收集的,那么b也是垃圾收集的吗?如果对象a和对象b没有被其他对象(连接到GC根对象)引用,那么这两个对象都会被垃圾收集
建议您阅读此如果外部引用是对该对象的唯一引用,则内部对象将被垃圾收集。如果您有B的getter/setter,或者传入了这个B,那么可能存在对该对象的另一个引用 …如果外部对象是垃圾收集的,那么内部对象也是垃圾收集的吗 如果没有任何不符合GC条件的对象具有对其的引用,则该对象符合GC条件。因此,在您的情况下,如果没有任何其他内容引用
b
持有的对象,那么是的,它符合GC的条件
但是,假设您在A上有此getter
:
public B getB() {
return this.b;
}
你的代码是:
A a = new A();
a.doOperationOnB();
B newReference = a.getB(); // Getting a reference to A's `b`
a = null;
现在,尽管
a
用于引用的对象符合GC的条件,但是a.b
用于引用的对象是而不是,因为newReference
中有一个未完成的引用。(当然,如果这是在main
中,并且main
即将返回,那么该引用不会持续很长时间,但是…将a
分配给null
不会保证垃圾收集
如果
a
中对实例b
的引用未被其他对象使用,则很可能b
将在启用a
时被垃圾收集 不要相信我的话,但我相信当没有任何东西指向一段内存时,垃圾就会被收集起来。在这种情况下,通过将a
设置为null
,没有任何东西指向a
的前一个值,因此被收集。如果对内部对象的引用为零,则可以对其进行垃圾收集。时期如果A中的实例方法正在执行,则调用方中必须有对A的引用,而调用方又持有对B的引用,这就足以使MoreVTNB不再是垃圾收集。