第18行// TODO时,有多少个对象符合GC条件

时间:2016-12-27 09:39:52

标签: java object garbage-collection

在第18行找出有多少对象符合GC条件时,我有点困惑.Plz解释

class B{}
class A{
    static B b1;
    B b2;
}
public class Test {
    public static void main(String[] args) {
        B b1=new B();
        B b2=new B();
        A a1=new A();
        A a2=new A();
        a1.b1=b1;
        a1.b2=b1;
        a2.b2=b2;
        a1=null;
        b1=null;
        b2=null;
        // TODO Auto-generated method stub
    }
}

第19行

时有多少个对象符合GC条件

2 个答案:

答案 0 :(得分:1)

假设第19行是由TODO Auto-generated method stub标记的行,那么在程序创建的对象中,第19行唯一符合条件 GC的对象是由变量a1。

最初分配给a2的对象仍然已分配,因此无法使用。

A.b1中的静态值仍然分配给最初分配给b1的对象,因此该对象不适用于GC - 静态值在类的生命周期中存活,因此即使实例a1可能获得GC&#39 ; d仍然可以引用通过它分配的静态实例。

由于仍然分配了实例a2,因此实例字段a2.b2也不可用于GC。该值保存主方法中最初分配给局部变量b2的B实例。

在main方法中创建的四个对象中,程序最后一行实际可用于GC的唯一对象是最初分配给a1的对象。它的唯一引用已设置为null,因此实例不再可访问。所有其他实例都可以通过局部变量(a2),静态引用(A.b1)或实例引用(a2.b2)访问。

答案 1 :(得分:1)

绿色对象有资格进行垃圾回收。

只要一个对象有资格进行垃圾收集,该对象内的引用就不再重要了。

但是,静态引用实际上并不需要存在对象(没有右边的A表示静态引用b1)。

:A代表A类的对象

:B代表B类的对象

enter image description here