java GC:静态变量在应用程序生存期内不会持久

时间:2018-02-15 10:22:01

标签: java garbage-collection jvm

我总是被告知静态变量会持续应用程序的整个生命周期,但我只是读到了关于javas GC的内容,这让我质疑该声明:

  

如果JVM发现不再需要它们,则可能会收集(卸载)类,并且其他类可能需要空间。永久世代包含在完整的垃圾收集中。

所以问题是什么会导致JVM这样做,这是否意味着所有静态类变量都在某种意义上"重置"?

1 个答案:

答案 0 :(得分:3)

  

所以问题是什么会导致JVM这样做......

当无法再访问时会发生这种情况。实际上,只有当应用程序(或框架)动态创建类加载器,动态加载类,然后这些类的类加载器,类和实例都无法被应用程序的其余部分访问时,才会发生这种情况。

应用程序的主要类加载器加载的类不会发生这种情况,因为这些类总是可以访问的。 (例如,使用主要类加载器调用ClassLoader.forName(...)。)

  

...这是否意味着所有静态类变量都在某种意义上"重置"?

没有。更好的表征是static变量已经不存在,如果它们属于已卸载的类。 (就像局部变量在超出范围时不再存在一样。)

请注意,只有在卸载类时才会发生这种情况。如果应用程序仍然可以观察有问题的静态变量,那么这对于变量可达就足够了......这会阻止类卸载