给定一个仅在程序设置中使用的假设实用程序类:
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
当myObject不再被使用时,它会被垃圾收集,还是会在程序的生命周期中保留?
加载类时,无法为垃圾收集选择静态变量.当相应的类加载器(负责加载此类)本身被收集用于垃圾时,可以收集它们.
查看JLS Section 12.7卸载类和接口
当且仅当其定义的类加载器可能被垃圾收集器回收时,可以卸载类或接口[...]类和由引导加载程序加载的接口可能不会被卸载.
静态变量由ClassLoaders引用的Class对象引用 - 除非ClassLoader以某种方式删除Class(如果可能的话)或ClassLoader本身有资格进行收集(更可能是 - 考虑卸载webapps)静态变量(或相反,他们引用的对象将不会被收集.
如果您希望临时对象用于静态初始化然后处理,您可以使用静态初始化块,例如
class MyUtils { static { MyObject myObject = new MyObject(); doStuff(myObject, params); } static boolean doStuff(MyObject myObject, Params... params) { // do stuff with myObject and params... } }
由于静态初始化块是一种特殊的静态方法,因此myObject是一个局部变量,在块完成执行后可以进行垃圾收集.
myObject是引用而不是对象.当没有引用指向它时,对象会自动进行垃圾回收,因为它无法访问.
因此,如果您取消引用它,静态引用"myObject"背后的对象也可以进行垃圾回收
myObject = null;
并且没有其他对此对象的引用.
但是,静态引用和变量将在程序的生命周期内保留.
我认为这回答了你的问题 - 除非该类来自一个特殊的类加载器并且卸载了类,否则基本上不会.