Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态字段是否为垃圾收集打开?_Java_Static_Garbage Collection_Static Members - Fatal编程技术网

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.Do
Class
不包含静态变量的对象会被它们的类加载器引用吗?@bruno,根据你的链接,这是否意味着一个类加载器对它加载的每个类都有引用,即使加载的类没有静态成员?@brunoconde,我不认为这是真的。到底是哪一段声明?(请继续讨论)类装入器何时有资格进行垃圾收集。?@RohitBandil-何时无法访问。