是静态字段打开垃圾收集?
给定一个仅在程序设置中使用的假设实用程序类:
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
myObject会在不再使用的时候被垃圾回收,还是会在程序的整个生命周期中继续使用?
加载类时,无法为垃圾收集选择静态变量。 当相应的类加载器(负责加载这个类)本身被收集用于垃圾时,可以收集它们。
检查JLS部分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;
并没有其他引用这个对象。
但是,静态引用和变量在程序的整个生命周期中保持不变。
我认为这回答你的问题 – 基本上没有,除非类来自一个特殊的类加载器,并卸载类。