【发布时间】:2018-02-15 10:22:00
【问题描述】:
一直有人告诉我,静态变量会持续应用程序的整个生命周期,但我刚刚读到有关 javas GC 的这篇文章,这让我对这个说法产生了疑问:
如果 JVM 发现不再需要这些类并且其他类可能需要空间,则这些类可能会被收集(卸载)。永久代包含在完整的垃圾回收中。
那么问题是什么会导致 JVM 这样做,这是否意味着所有静态类变量在某种意义上都“重置”了?
【问题讨论】:
标签: java garbage-collection jvm
一直有人告诉我,静态变量会持续应用程序的整个生命周期,但我刚刚读到有关 javas GC 的这篇文章,这让我对这个说法产生了疑问:
如果 JVM 发现不再需要这些类并且其他类可能需要空间,则这些类可能会被收集(卸载)。永久代包含在完整的垃圾回收中。
那么问题是什么会导致 JVM 这样做,这是否意味着所有静态类变量在某种意义上都“重置”了?
【问题讨论】:
标签: java garbage-collection jvm
所以问题是什么会导致 JVM 这样做...
当一个 class 不再可访问时会发生这种情况。实际上,只有当应用程序(或框架)动态创建类加载器、动态加载类,然后类加载器、类和这些类的实例都变得无法被应用程序的其余部分访问时,才会发生这种情况。
由应用程序的主要类加载器加载的类不会发生这种情况,因为此类类始终是可访问的。 (例如,通过使用主类加载器调用 ClassLoader.forName(...)。)
...这是否意味着所有静态类变量在某种意义上都是“重置”?
没有。更好的表征是,如果 static 变量属于已卸载的类,则它们已不复存在。 (就像局部变量在超出范围时不再存在一样。)
请注意,这只发生在/当类被卸载时。如果应用程序仍然可以观察有问题的静态变量,那么这些变量就足够了可访问 ...这将禁止类卸载.
【讨论】:
public static int life = 42;,如果我把它改成30卸载它然后重新加载它的生命值将是42,对吧?