Java 非静态内部类对象不再被引用后是否会被垃圾收集?
我有一个类似以下的SpringBean: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
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(但不是您的代码)将保留对它们的引用,它们将不会被垃圾收集。内部类的实例将根据正常规则被垃圾收集(即,当它们不再被引用时)。但是,内部类的每个实例都包含对外部类的父实例的隐藏引用。这意味着,如果存在对内部类实例的任何活动引用,它们将阻止外部类的关联实例被垃圾收集。但是它只在这个方向上起作用,而不是相反方向。这就是我想的,我只是不知道是否存在从外部类到内部类的隐式引用。不,没有。反之亦然。非静态内部类包含对其外部类实例的引用。“集合的迭代器通常作为集合的内部类实现。”帮助我理解外部类和内部类的生命周期之间的关系。