java 8中的字符串常量池位于哪个内存区方法区?
我读过oracle文档,但并没有给出关于方法区域和字符串常量池的任何信息。我怀疑JDK 8或8+中的方法区域、字符串常量池驻留在内存中的位置。java语言规范没有指定它的位置 这也没关系。这些对象最终被创建,没有办法直接访问它们,这无关紧要 java就是这样工作的:规范说明了您可以依赖和不可以依赖的东西,这为JVM实现提供了空间,让它们可以做任何他们想做的事情,只要它们履行了合同。“内存在哪里…”是一个在java中无关紧要的问题,您根本无法直接操作内存java 8中的字符串常量池位于哪个内存区方法区?,java,memory-management,jvm,Java,Memory Management,Jvm,我读过oracle文档,但并没有给出关于方法区域和字符串常量池的任何信息。我怀疑JDK 8或8+中的方法区域、字符串常量池驻留在内存中的位置。java语言规范没有指定它的位置 这也没关系。这些对象最终被创建,没有办法直接访问它们,这无关紧要 java就是这样工作的:规范说明了您可以依赖和不可以依赖的东西,这为JVM实现提供了空间,让它们可以做任何他们想做的事情,只要它们履行了合同。“内存在哪里…”是一个在java中无关紧要的问题,您根本无法直接操作内存 回到为什么你认为你需要知道并找到另一种方法
回到为什么你认为你需要知道并找到另一种方法;这个问题的任何答案都是特定于JVM的某些实现的,因此您的代码不会是可移植的。也就是说,任何对JVM的版本更新,或者一些替代JVM实现(如OpenJ9)都会滚动,您的代码就会中断,可能是原始核心转储。这听起来不是个好主意。java语言规范没有指定它的位置 这也没关系。这些对象最终被创建,没有办法直接访问它们,这无关紧要 java就是这样工作的:规范说明了您可以依赖和不可以依赖的东西,这为JVM实现提供了空间,让它们可以做任何他们想做的事情,只要它们履行了合同。“内存在哪里…”是一个在java中无关紧要的问题,您根本无法直接操作内存 回到为什么你认为你需要知道并找到另一种方法;这个问题的任何答案都是特定于JVM的某些实现的,因此您的代码不会是可移植的。也就是说,任何对JVM的版本更新,或者一些替代JVM实现(如OpenJ9)都会滚动,您的代码就会中断,可能是原始核心转储。这听起来不是个好主意。在Java 8及更高版本中:
- 方法区域位于元空间中
- 字符串池位于常规堆中
顺便说一下,它被称为“字符串池”,而不是“字符串常量池”
- 所有字符串都是不变的
- 声明为
(在这个意义上是常量)的字符串变量不一定在字符串池中static final
- 并非字符串池中的所有字符串都是
静态final
- 并非字符串池中的所有字符串都是字符串文本或其他编译时常量值
- 方法区域位于元空间中
- 字符串池位于常规堆中
- 所有字符串都是不变的
- 声明为
(在这个意义上是常量)的字符串变量不一定在字符串池中static final
- 并非字符串池中的所有字符串都是
静态final
- 并非字符串池中的所有字符串都是字符串文本或其他编译时常量值
- 在Java 8及更高版本中:
顺便说一下,它被称为“字符串池”,而不是“字符串常量池”