非静态内部类对象是否在不再引用后被垃圾收集?

时间:2012-02-24 10:26:06

标签: java garbage-collection inner-classes

我有一个类似于以下的弹簧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()对此进行了自己的测试,看起来实例正在被垃圾收集,我只是希望澄清这一点。

由于

4 个答案:

答案 0 :(得分:21)

内部类的实例将根据正常规则进行垃圾收集(即,不再引用它们时)。但是,内部类的每个实例都包含对其外部类的父实例的隐藏引用。这意味着如果对内部类的实例有任何实时引用,它们将阻止外部类的关联实例被垃圾回收。但它只适用于那个方向,而不是相反。

答案 1 :(得分:3)

他们为什么不收集垃圾? GC不关心对象的类型。如果它无法访问,那就是GCed。如果它可以到达,那就不是GCed。

答案 2 :(得分:0)

如果没有对象的引用,它将被标记为收集。所以,它应该没问题,即使它是公共的,非静态的内部类。

反过来说,即如果有对这些内部类对象的引用,则外部类对象不会被收集,即使没有直接引用它。

答案 3 :(得分:0)

当然,顺便说一下,如果你的实例被Spring保存为单例bean,那么Spring(但不是你的代码)将继续引用它们,并且它们不会被垃圾收集。