【问题标题】:Are non-static inner class objects garbage collected after they are no longer referenced?非静态内部类对象在不再被引用后是否会被垃圾回收?
【发布时间】:2012-02-24 10:26:05
【问题描述】:

我有一个类似于以下的 spring bean:

public class MyServiceImpl {
    private MyDAO myDAO;

    public class MyInnerClass implements SomeInterface<MyInnerClass> {

        @Override
        public MyInnerClass loadFreshObject(final String key) {
            return myDAO.load(key);
        }
    }

}

MyInnerClass 的实例是在 spring bean 之外的代码中创建的,但不会保留对这些实例的引用。

假设我无法控制这些公共非静态内部类的使用(我知道理想情况下这些是私有的和静态的,以避免泄漏对“this”的引用),“MyInnerClass”的创建实例是否正确垃圾收集?

我已经通过覆盖finalize() 对此进行了自己的测试,看来这些实例正在正确地被垃圾收集,我只是希望对此进行澄清。

谢谢

【问题讨论】:

  • 集合的迭代器通常实现为集合的内部类。”帮助我理解了外部类和内部类的生命周期之间的关系。

标签: java garbage-collection inner-classes


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这就是我的想法,我只是没有从外部类到内部类的一些隐式引用。
    • 不,没有。反之亦然。非静态内部类包含对其外部类实例的引用。
    【解决方案3】:

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

    反之,如果有对这些内部类对象的引用,那么即使没有直接引用,外部类对象也不会被收集。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多