【问题标题】:java GC: static variables not lasting through the applications lifetimejava GC:静态变量不会持续到应用程序的生命周期
【发布时间】:2018-02-15 10:22:00
【问题描述】:

一直有人告诉我,静态变量会持续应用程序的整个生命周期,但我刚刚读到有关 javas GC 的这篇文章,这让我对这个说法产生了疑问:

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

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

【问题讨论】:

    标签: java garbage-collection jvm


    【解决方案1】:

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

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

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

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

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

    请注意,这只发生在/当类被卸载时。如果应用程序仍然可以观察有问题的静态变量,那么这些变量就足够了可访问 ...这将禁止类卸载.

    【讨论】:

    • 我可能应该改写重置部分。但是,如果我正确理解您,如果您要重新加载该类,它会回到它的默认值。所以说我有一个字段public static int life = 42;,如果我把它改成30卸载它然后重新加载它的生命值将是42,对吧?
    • 没错。当你重新加载类时,你会得到一个不同的类型……就 Java 类型系统而言。每种类型都有自己独特的类静态变量集。
    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 2011-09-12
    • 1970-01-01
    • 2013-07-27
    • 2011-04-18
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多