【问题标题】:in which memory area method area , string constant pool reside in java 8?java 8中的内存区方法区、字符串常量池位于哪个内存区?
【发布时间】:2020-08-19 13:47:33
【问题描述】:

我已经阅读了 oracle 文档,但是没有给出关于方法区和字符串常量池的任何内容。我怀疑方法区,字符串常量池驻留在 JDK 8 或 8+ 的内存中。

【问题讨论】:

    标签: java memory-management jvm


    【解决方案1】:

    java 语言规范没有指定它的位置。

    这也无所谓。这些对象最终都被创建了,没有办法直接访问它们,这没关系。

    这就是 java 的工作原理:规范说明了您可以依赖什么和不可以依赖什么,这为 JVM 实现提供了空间来做他们想做的任何事情,只要它们履行合同。 “内存在哪里……”这个问题在java中无关紧要,根本无法直接操作内存。

    回到你认为你需要知道的原因并找到另一种方法;这个问题的任何答案都将特定于 JVM 的某些实现,因此您的代码将不可移植。也就是说,对 JVM 的任何版本更新,或诸如 OpenJ9 之类的一些替代 JVM 实现都会滚动,您的代码就会中断,可能是原始核心转储。这听起来不是个好主意。

    【讨论】:

      【解决方案2】:

      在 Java 8 及更高版本中:

      • 方法区域在元空间中
      • 字符串池位于常规堆中。

      这是 Oracle 和 OpenJDK JVM 的实现细节。其他实现可能不同。但字符串和代码的存储位置并不重要。您的应用程序不需要知道。


      顺便说一下,它叫“字符串池”,而不是“字符串常量池”。

      • 所有字符串都是不变的,因为它们是不可变的。
      • 声明为static final 的字符串变量(在 意义上是常量)不一定在字符串池中。
      • 并非字符串池中的所有字符串都是static final
      • 并非字符串池中的所有字符串都是字符串文字或其他编译时常量值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-09
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        相关资源
        最近更新 更多