[英]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.