V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Niner
V2EX  ›  Java

求教有关 jvm 方法区的问题

  •  
  •   Niner · 2023-07-25 14:33:56 +08:00 · 1403 次点击
    这是一个创建于 520 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    常量 方法区

    静态变量 方法区

    局部变量 栈

    成员变量 堆

    常量且字面量 常量池

    常量且引用对象 堆

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

    静态变量且字面量 常量池

    局部变量且引用对象 堆

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

    局部变量且"" 常量池

    成员变量且引用对象 堆

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

    成员变量且"" 常量池

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

    1.8 里面只有元空间没有持久代了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5661 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:11 · PVG 11:11 · LAX 19:11 · JFK 22:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.