繁体   English   中英

有资格进行垃圾收集吗?

[英]Eligible for garbage collection?

我知道内部类的实例必须绑定到包装器类的实例,这导致我质疑包装器类实例的情况,当没有引用时,但仍引用绑定实例时。

那么,一旦引用设置为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
    }
}

如您所述,(非静态)内部类对创建它的外部类实例具有(隐式)引用。 因此,除非不再(强烈地)引用内部类的实例,否则无法对外部类的实例进行垃圾回收。

如果查看字节码,则会发现Inner保留了对Outer的隐藏引用,该引用是Java编译器自动生成的。

因此,只要oi可以被引用, otr也可以被引用。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM