求教有关 jvm 方法区的问题

304 天前
 Niner

1.请问这张图里的表述是否存在一些问题?
2.位于运行时常量池的 final 常量值和字符串字面量都是保存对象引用,对象本身还是在堆中?
3.运行时常量池的其他具体是指那些?
4.有些观点认为 jvm 方法区还存储静态变量,如果是的请问是位于方法区的哪里?
1222 次点击
所在节点    Java
4 条回复
kang00001
304 天前
图片挂了
Akitora
304 天前
Java 虚拟机对于 Class 文件每一部分(自然也包括常量池)的格式都有严格规定,如每一个字节用于存储哪种数据都必须符合规范上的要求才会被虚拟机认可、加载和执行,但对于运行时常量池,《 Java 虚拟机规范》并没有做任何细节的要求,不同提供商实现的虚拟机可以按照自己的需要来实现这个内存区域,不过一般来说,除了保存 Class 文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中。
Akitora
304 天前
Aresxue
303 天前
永久代可以理解为 HotSpot 虚拟机对虚拟机规范中方法区的一种实现方式,在物理上两者是相等的

常量 方法区

静态变量 方法区

局部变量 栈

成员变量 堆

常量且字面量 常量池

常量且引用对象 堆

静态变量且引用对象 方法区

静态变量且字面量 常量池

局部变量且引用对象 堆

局部变量且基本类型字面量 栈

局部变量且"" 常量池

成员变量且引用对象 堆

成员变量且基本类型字面量 堆

成员变量且"" 常量池

1.7 符号引用(Symbols)转移到了 native heap ;字面量(interned strings)转移到了 java heap ;类的静态变量(class statics)转移到了 java heap ,运行时常量池也到了 java heap(1.8 又到了元空间)

1.8 里面只有元空间没有持久代了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/959551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX