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不再是垃圾收集。