Answers:
加载类时,不能选择静态变量进行垃圾回收。当各自的类加载器(负责加载该类)本身被收集为垃圾时,可以收集它们。
仅当垃圾回收器可以回收定义的类加载器时,才可以卸载类或接口。引导加载器加载的类和接口可以不卸载。
静态变量由Class对象引用,而Class对象则由ClassLoaders引用-因此,除非ClassLoader以某种方式(如果可能)丢弃Class,或者ClassLoader本身有资格进行收集(更有可能-考虑卸载webapps),则静态变量(或而是不会引用它们引用的对象。
Class
包含静态变量的对象会被其类加载器引用吗?
如果您希望将一个临时对象用于静态初始化然后进行处置,则可以使用静态初始化程序块,例如
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;
并且没有其他引用此对象。
但是,静态引用和变量在程序的生命周期内仍然保留。
null
为的结尾static block
是一个可行的选择。但就我而言,该对象的生存期需要比静态块更长。对象的最终用途不是很具体。因此,我问有关利用垃圾收集器的问题。