Java 静态字段是否为垃圾收集打开?
给定一个仅在程序设置中使用的假设实用程序类:Java 静态字段是否为垃圾收集打开?,java,static,garbage-collection,static-members,Java,Static,Garbage Collection,Static Members,给定一个仅在程序设置中使用的假设实用程序类: class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } } myObject不再使用时是否会被垃圾收集,或者它会在程序的生命周期中一直存在吗?我想这回
class MyUtils {
private static MyObject myObject = new MyObject();
/*package*/static boolean doStuff(Params... params) {
// do stuff with myObject and params...
}
}
myObject不再使用时是否会被垃圾收集,或者它会在程序的生命周期中一直存在吗?我想这回答了你的问题-基本上不会,除非类来自一个特殊的类加载器,并且它卸载了类。静态变量由类加载器引用的类对象引用-所以除非类加载器以某种方式删除了类(如果可能的话)或者类加载器本身有资格收集静态变量(或者更确切地说,它们引用的对象)(更可能的情况是,考虑卸载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;
并且没有其他对该对象的引用
但是,静态引用和变量会在程序的生命周期内保留。这里的关键是类实例(即对象)的垃圾收集。类加载器实例本质上是一个对象。因此,如果类加载器对象没有垃圾收集,则它们的任何引用都存储在堆中(即静态内容)几乎永远不会被垃圾收集。字符串池是个例外 所以在你突然决定之前
私有静态MyGiantClass myGiantObject=new MyGiantClass()
仔细想想,我已经学会了这条艰难的道路。欢迎来到StackOverflow!在
静态块的末尾将对象设置为null
是一个可行的选择。但是,在我的情况下,对象的生命周期需要比静态块更长。对象的用途不是很具体;因此我询问如何利用garbage collector.DoClass
不包含静态变量的对象会被它们的类加载器引用吗?@bruno,根据你的链接,这是否意味着一个类加载器对它加载的每个类都有引用,即使加载的类没有静态成员?@brunoconde,我不认为这是真的。到底是哪一段声明?(请继续讨论)类装入器何时有资格进行垃圾收集。?@RohitBandil-何时无法访问。