java - POJO 中的静态变量以及对象和类的垃圾回收

标签 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() {
        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/

相关文章:

java - ORM:非主键连接列上的 OneToOne 映射 - ISBN 映射的书籍和库存

java - 设置日志文件名以在 Log4j 中包含当前日期

java - java.util.concurrent.ExecutorService#submit花费很长时间

c# - 静态字段初始化顺序 (C#) - 有人可以解释这个片段吗?

java - 在java中初始化和传递字符串

java - 验证 Java 中调用的 Ibatis 过程

javascript - 如何调试 Chrome Javascript 中 GC 事件之间看似长时间的停顿

actionscript-3 - 垃圾收集器在每一帧上占用所有 cpu 时间的原因

c++ - 是否可以在编译时加载/读取 shape_predictor_68_face_landmarks.dat?

c++ - 使用成员函数作为回调