Java8中的哪个内存区方法区、字符串常量池?

sigwle7e  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(367)

我读过oracle文档,但并没有给出关于方法区域和字符串常量池的任何信息。我怀疑jdk8或8+中的方法区域、字符串常量池是否驻留在内存中。

jutyujz0

jutyujz01#

java语言规范没有指定它的位置。
这也没关系。这些对象最终被创建,没有办法直接访问它们,这无关紧要。
这就是java的工作原理:规范说明了什么是可以依赖的,什么是不可以依赖的,这就给了jvm实现空间,让它们可以做任何想做的事情,只要它们履行了合同。”“内存中的什么地方……”是一个在java中无关紧要的问题,您根本不能直接操纵内存。
回到为什么你认为你需要知道并找到另一种方法;对这个问题的任何回答都是特定于jvm的某个实现的,因此您的代码是不可移植的。也就是说,任何对jvm的版本更新,或者一些替代的jvm实现,比如openj9,都会出现代码中断的情况,可能是原始内核转储。听起来不是个好主意。

8qgya5xd

8qgya5xd2#

在java 8及更高版本中:
方法区域位于元空间中
字符串池位于常规堆中。
这是针对oracle和openjdkjvms的实现细节。其他实现可能不同。但是字符串和代码存储在哪里并不重要。你的申请不需要知道。
顺便说一下,它被称为“字符串池”,而不是“字符串常量池”。
所有的字符串都是不变的。
声明为 static final (在这个意义上是常量)不一定在字符串池中。
并非字符串池中的所有字符串都是 static final .
并非字符串池中的所有字符串都是字符串文字或其他编译时常量值。

相关问题