内部初始化对象的垃圾收集

时间:2015-02-16 11:40:22

标签: 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

   //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也是垃圾收集?

4 个答案:

答案 0 :(得分:0)

如果对象A和对象B未被其他对象(连接到GC根对象)引用,则两者都不会被攻击。

建议您阅读此article

答案 1 :(得分:0)

  

...如果外部对象是垃圾收集那么内部对象也是垃圾收集?

如果没有任何不符合GC要求的对象有参考,则该对象符合GC条件。因此,在您的情况下,如果没有其他内容可以引用b所持有的对象,是的,它有资格获得GC。

然而,假设您在A上有这个吸气剂:

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即将返回,则该引用不会持续很长时间,但是......)

答案 2 :(得分:0)

a分配给null 保证垃圾回收。

如果其他对象未使用ba的实例引用,则可能 ba进行垃圾回收是的。

答案 3 :(得分:-1)

如果外部引用它只是对该对象的引用,则内部对象将被垃圾收集。如果你有B的getter / setter,或者传入这个B,那么可能会有另一个对象的引用。