我编写了一个基类来向存储库发出请求。它有一个静态字段,在应用程序中用于某些目的。
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?
最佳答案
不,静态字段不会阻止子类的垃圾收集(如果这样做,这将是一个主要问题,使得静态字段在垃圾收集语言中几乎无法使用!)
您可以通过添加 finalizer 来测试这一点到您的类,然后在循环中创建一堆它们,调用 System.gc() 来引发垃圾收集。
如果您的 finalize()
方法打印出一条消息,您可以看到 GC 正在发生。
protected void finalize() throws Throwable {
System.out.println("Finalize!");
}
原因是静态字段属于类对象(RepositoryRequest
)。当此类的任何实例存在时,无法对此类进行垃圾收集,并且通常不会卸载类,除非它们的 ClassLoader is garbage collected ,这是不寻常的。
但是,分配给每个实例的所有内存都可以安全地回收,而不会对类对象产生任何影响。
在某些情况下,静态成员可以阻止其他数据的 GC;例如,如果您将普通 Collection 中类的所有实例缓存为静态字段,那么它们就不能被 GCd(因为仍然存在对它们的“实时”引用)。
关于java - POJO 中的静态变量以及对象和类的垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29842736/