是否有资格收集垃圾?

时间:2014-06-30 15:08:36

标签: java garbage-collection inner-classes

我知道内部类的一个实例必须绑定到包装类的一个实例,这导致我质疑包装器类实例会发生什么,当没有对它的引用但是仍然有引用时绑定的实例。

因此,一旦引用设置为null,otr是否有资格引用垃圾收集?

class Outer
{
    class Inner
    {

    }
}

class Test{
    public static void main(String []args){
        Outer otr = new Outer() ;           // (1)
        Outer.Inner oi = otr.new Inner() ;  // (2)
        otr = null ;                        // (3)
        // more complicated code
    }
}

3 个答案:

答案 0 :(得分:4)

正如您所说,(非静态)内部类具有对用于创建它的外部类实例的(隐式)引用。因此,在不再(强烈)引用内部类的实例之前,不能对外部类的实例进行垃圾回收。

答案 1 :(得分:3)

如果查看字节代码,那么您将看到Inner保留对Outer的隐藏引用,该引用由Java编译器自动生成。

只要可以引用oi,也可以引用otr

现在您可能认为优化步骤可以消除对Outer的隐藏引用,因为Inner从不使用它。但有人可以扩展Inner并尝试从那里访问Outer,因此编译器无法做出这样的假设。

答案 2 :(得分:2)

不,(1)中创建的对象无法收集垃圾。

在(2)中创建的内部类实例保存对object(1)的引用,以便访问它的字段和方法。

删除第(3)行中对象(1)的直接引用不会使对象(1)有资格进行垃圾回收,因为对象仍在内部类实例(2)内部使用。