我总是被告知静态变量会持续应用程序的整个生命周期,但我只是读到了关于javas GC的内容,这让我质疑该声明:
如果JVM发现不再需要它们,则可能会收集(卸载)类,并且其他类可能需要空间。永久世代包含在完整的垃圾收集中。
所以问题是什么会导致JVM这样做,这是否意味着所有静态类变量都在某种意义上"重置"?
答案 0 :(得分:3)
所以问题是什么会导致JVM这样做......
当无法再访问类时会发生这种情况。实际上,只有当应用程序(或框架)动态创建类加载器,动态加载类,然后这些类的类加载器,类和实例都无法被应用程序的其余部分访问时,才会发生这种情况。
应用程序的主要类加载器加载的类不会发生这种情况,因为这些类总是可以访问的。 (例如,使用主要类加载器调用ClassLoader.forName(...)
。)
...这是否意味着所有静态类变量都在某种意义上"重置"?
没有。更好的表征是static
变量已经不存在,如果它们属于已卸载的类。 (就像局部变量在超出范围时不再存在一样。)
请注意,只有在卸载类时才会发生这种情况。如果应用程序仍然可以观察有问题的静态变量,那么这对于变量可达就足够了......这会阻止类卸载