我有一个类似于以下的弹簧bean:
public class MyServiceImpl {
private MyDAO myDAO;
public class MyInnerClass implements SomeInterface<MyInnerClass> {
@Override
public MyInnerClass loadFreshObject(final String key) {
return myDAO.load(key);
}
}
}
正在Spring bean之外的代码中创建MyInnerClass
的实例,但不保留对这些实例的引用。
假设我无法控制这些公共非静态内部类的使用(我知道这些将是私有的和静态的,以避免泄漏对'this'的引用),所创建的'MyInnerClass'实例是否正确垃圾收集?
我已经通过覆盖finalize()
对此进行了自己的测试,看起来实例正在被垃圾收集,我只是希望澄清这一点。
由于
答案 0 :(得分:21)
内部类的实例将根据正常规则进行垃圾收集(即,不再引用它们时)。但是,内部类的每个实例都包含对其外部类的父实例的隐藏引用。这意味着如果对内部类的实例有任何实时引用,它们将阻止外部类的关联实例被垃圾回收。但它只适用于那个方向,而不是相反。
答案 1 :(得分:3)
他们为什么不收集垃圾? GC不关心对象的类型。如果它无法访问,那就是GCed。如果它可以到达,那就不是GCed。
答案 2 :(得分:0)
如果没有对象的引用,它将被标记为收集。所以,它应该没问题,即使它是公共的,非静态的内部类。
反过来说,即如果有对这些内部类对象的引用,则外部类对象不会被收集,即使没有直接引用它。
答案 3 :(得分:0)
当然,顺便说一下,如果你的实例被Spring保存为单例bean,那么Spring(但不是你的代码)将继续引用它们,并且它们不会被垃圾收集。