当前位置:  开发笔记 > 编程语言 > 正文

静态字段是否打开以进行垃圾回收?

如何解决《静态字段是否打开以进行垃圾回收?》经验,为你挑选了5个好方法。

给定一个仅在程序设置中使用的假设实用程序类:

class MyUtils {
   private static MyObject myObject = new MyObject();
   /*package*/static boolean doStuff(Params... params) {
       // do stuff with myObject and params...
   }
}

当myObject不再被使用时,它会被垃圾收集,还是会在程序的生命周期中保留?



1> bruno conde..:

加载类时,无法为垃圾收集选择静态变量.当相应的类加载器(负责加载此类)本身被收集用于垃圾时,可以收集它们.

查看JLS Section 12.7卸载类和接口

当且仅当其定义的类加载器可能被垃圾收集器回收时,可以卸载类或接口[...]类和由引导加载程序加载的接口可能不会被卸载.



2> Jon Skeet..:

静态变量由ClassLoaders引用的Class对象引用 - 除非ClassLoader以某种方式删除Class(如果可能的话)或ClassLoader本身有资格进行收集(更可能是 - 考虑卸载webapps)静态变量(或相反,他们引用的对象将不会被收集.



3> finnw..:

如果您希望临时对象用于静态初始化然后处理,您可以使用静态初始化块,例如

class MyUtils {
   static
   {
      MyObject myObject = new MyObject();
      doStuff(myObject, params);
   }

   static boolean doStuff(MyObject myObject, Params... params) {
       // do stuff with myObject and params...
   }
}

由于静态初始化块是一种特殊的静态方法,因此myObject是一个局部变量,在块完成执行后可以进行垃圾收集.



4> Felix Keil..:

myObject是引用而不是对象.当没有引用指向它时,对象会自动进行垃圾回收,因为它无法访问.

因此,如果您取消引用它,静态引用"myObject"背后的对象也可以进行垃圾回收

myObject = null;

并且没有其他对此对象的引用.

但是,静态引用和变量将在程序的生命周期内保留.



5> Tom..:

我认为这回答了你的问题 - 除非该类来自一个特殊的类加载器并且卸载了类,否则基本上不会.


或者直到有人更新静态字段.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有