Java POJO中的静态变量以及对象和类的垃圾收集

Java POJO中的静态变量以及对象和类的垃圾收集,java,garbage-collection,static-members,Java,Garbage Collection,Static Members,我已经编写了一个基类,用于向存储库发出请求。它有一个静态字段,用于应用程序中的某些目的 public abstract class RepositoryRequest { private static String version; { version = 2.0; //Actual read is happening from some configuration file. } protected String getVersion() {

我已经编写了一个基类,用于向存储库发出请求。它有一个静态字段,用于应用程序中的某些目的

public abstract class RepositoryRequest {
    private static String version;

    {
        version = 2.0; //Actual read is happening from some configuration file.
    }

    protected String getVersion() {
        return version;
    }
}
我们有多个请求POJO,它们扩展了这个抽象类

public class ARepositoryRequest extends RepositoryRequest {
    //Some properties here
    @Override
    public String toString() {
        return "Some string generated by some logic" + getVersion();
    }
}
类似地,其他类也在扩展和重写toString()方法

我对这些POJO对象的垃圾收集有一些疑问:

1. Would this kind of usage of static variable will not let the POJO objects garbage collected?
2. Is there any issue with Objects/Classes in their garbage collection?

问题已在这里回答:

答复: “加载类时,不能为垃圾收集选择静态变量。当相应的类加载器(负责加载该类)本身为垃圾收集时,可以收集静态变量

查看

当且仅当类或接口的定义类 垃圾收集器[…]类和 引导加载程序加载的接口可能无法卸载。 "


不,静态字段不会阻止子类的垃圾收集(如果阻止了,这将是一个大问题,使静态字段在垃圾收集语言中几乎不可用!)

您可以通过向类中添加一个来测试这一点,然后在循环中创建一组类,调用
System.gc()
,以引发垃圾收集。 如果您的
finalize()
方法打印出一条消息,您可以看到GC正在发生

protected void finalize() throws Throwable {
    System.out.println("Finalize!");
}
原因是静态字段属于类对象(
RepositoryRequest
)。当该类的任何实例存在时,都不能对其进行垃圾收集,并且通常不会卸载类,除非它们的实例存在,这是不寻常的

但是,可以安全地回收分配给每个实例的所有内存,而不会对类对象产生任何影响


在某些情况下,静态成员可以阻止其他数据的GC;例如,如果将普通集合中某个类的所有实例缓存为静态字段,则它们不能是GCd(因为仍然存在对它们的“活动”引用)。

可能的重复我不认为它是重复的-问题是该类的对象是否可以是GCd,不是静态字段本身是否可以是GCd。静态变量不会阻止对象实例(未从所述变量引用的对象实例)被GCd。具有静态变量的对象如何?它会被垃圾收集吗?