静态字段是否为垃圾回收打开了?

给定一个仅在程序设置中使用的假设实用程序类:

class MyUtils {
   private static MyObject myObject = new MyObject();
   /*package*/static boolean doStuff(Params... params) {
       // do stuff with myObject and params...
   }
}

myObject 会在不再使用时被垃圾回收,还是会在程序的整个生命周期内持续存在?


答案 1

在装入类时,不能为垃圾回收选择静态变量。当相应的类装入器(负责装入此类)本身被收集为垃圾时,可以收集它们。

查看 JLS 第 12.7 节 类和接口的卸载

当且仅当垃圾回收器可以回收其定义类装入器时,类或接口才可能被卸载 [...]引导加载程序装入的类和接口不能被卸载。


答案 2

静态变量由 ClassLoaders 引用的 Class 对象引用 - 因此,除非 ClassLoader 以某种方式删除类(如果可能的话)或者 ClassLoader 本身有资格收集(更有可能 - 想想卸载 webapps),否则静态变量(或者更确切地说,它们引用的对象)将不会被收集。


推荐