【发布时间】:2020-08-19 13:47:33
【问题描述】:
我已经阅读了 oracle 文档,但是没有给出关于方法区和字符串常量池的任何内容。我怀疑方法区,字符串常量池驻留在 JDK 8 或 8+ 的内存中。
【问题讨论】:
标签: java memory-management jvm
我已经阅读了 oracle 文档,但是没有给出关于方法区和字符串常量池的任何内容。我怀疑方法区,字符串常量池驻留在 JDK 8 或 8+ 的内存中。
【问题讨论】:
标签: java memory-management jvm
java 语言规范没有指定它的位置。
这也无所谓。这些对象最终都被创建了,没有办法直接访问它们,这没关系。
这就是 java 的工作原理:规范说明了您可以依赖什么和不可以依赖什么,这为 JVM 实现提供了空间来做他们想做的任何事情,只要它们履行合同。 “内存在哪里……”这个问题在java中无关紧要,根本无法直接操作内存。
回到你认为你需要知道的原因并找到另一种方法;这个问题的任何答案都将特定于 JVM 的某些实现,因此您的代码将不可移植。也就是说,对 JVM 的任何版本更新,或诸如 OpenJ9 之类的一些替代 JVM 实现都会滚动,您的代码就会中断,可能是原始核心转储。这听起来不是个好主意。
【讨论】:
在 Java 8 及更高版本中:
这是 Oracle 和 OpenJDK JVM 的实现细节。其他实现可能不同。但字符串和代码的存储位置并不重要。您的应用程序不需要知道。
顺便说一下,它叫“字符串池”,而不是“字符串常量池”。
static final 的字符串变量(在 意义上是常量)不一定在字符串池中。static final。【讨论】: