Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非静态内部类对象不再被引用后是否会被垃圾收集?_Java_Garbage Collection_Inner Classes - Fatal编程技术网

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

Java 非静态内部类对象不再被引用后是否会被垃圾收集?,java,garbage-collection,inner-classes,Java,Garbage Collection,Inner Classes,我有一个类似以下的SpringBean: public class MyServiceImpl { private MyDAO myDAO; public class MyInnerClass implements SomeInterface<MyInnerClass> { @Override public MyInnerClass loadFreshObject(final String key) { re

我有一个类似以下的SpringBean:

public class MyServiceImpl {
    private MyDAO myDAO;

    public class MyInnerClass implements SomeInterface<MyInnerClass> {

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

}
公共类MyServiceImpl{
私人密道密道;
公共类MyInnerClass实现了SomeInterface{
@凌驾
公共MyInnerClass loadFreshObject(最终字符串键){
返回myDAO.load(key);
}
}
}
MyInnerClass
的实例是在Springbean之外的代码中创建的,但没有保留对这些实例的引用

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

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


谢谢

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


另一种方法是,如果有对这些内部类对象的引用,那么外部类对象将不会被收集,即使没有对它的直接引用。

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

当然,顺便说一句,如果Spring将您的实例作为单例bean保存,Spring(但不是您的代码)将保留对它们的引用,它们将不会被垃圾收集。

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

这就是我想的,我只是不知道是否存在从外部类到内部类的隐式引用。不,没有。反之亦然。非静态内部类包含对其外部类实例的引用。“集合的迭代器通常作为集合的内部类实现。”帮助我理解外部类和内部类的生命周期之间的关系。