Java 常量池和方法区域的映射

Java 常量池和方法区域的映射,java,jvm,classloader,Java,Jvm,Classloader,我试图理解类文件是如何加载到方法区域并执行的。我对这个恒定的游泳池感到非常困惑 初始创建常量池的时间?在编制 类文件或加载类时 字节码在方法区域中的组织方式方法表 包括 有人能在草图中显示地图的图片表示吗 清晰理解的方法区域 编译Java文件时,对变量和方法的所有引用都作为符号引用存储在类的常量池中 以下是供您参考的链接: 当您将源代码编译为.class文件时,javac会创建一个常量池。你可以看到它,如果你做 javap-vmyclass 给你的班级 您可以通过以下方式查看类文件的字节码:

我试图理解类文件是如何加载到方法区域并执行的。我对这个恒定的游泳池感到非常困惑

  • 初始创建常量池的时间?在编制 类文件或加载类时

  • 字节码在方法区域中的组织方式方法表 包括

  • 有人能在草图中显示地图的图片表示吗 清晰理解的方法区域

  • 编译Java文件时,对变量和方法的所有引用都作为符号引用存储在类的常量池中

    以下是供您参考的链接:

  • 当您将源代码编译为.class文件时,javac会创建一个常量池。你可以看到它,如果你做
  • javap-vmyclass

    给你的班级

  • 您可以通过以下方式查看类文件的字节码:
  • “javap-c-v Main”

  • 方法区域只是堆的一部分,JVM在其中拥有关于该类的所有信息

  • 因为“常量池”的字面意思只是“常量池”,所以名称中有不同的东西,很容易混淆

  • 每个类文件都有一个常量池,描述该类中使用的所有常量,其中包括常量值,但也包括链接所需的符号引用。有些条目同时扮演这两个角色,例如类条目可以作为成员符号引用的所有者声明,在访问字段或调用方法时需要,但也可以用于获取类实例,例如源代码中出现的类文本。由于它是类文件的一部分,因此其格式在Java®虚拟机规范中指定,§4类文件格式,in.
    正如其他答案所说,您可以使用命令
    javap-vclass.name
    检查类的常量池

  • 在运行时有一个相应的数据结构,也称为。由于某些值表示为运行时对象(例如
    String
    Class
    MethodType
    MethodHandle
    ),符号引用必须解析为所表示的类和成员的运行时表示,此结构与类文件中的字节序列不同。但这些条目是对应的,因此每次为常量实例化对象或解析符号引用时,都可以记住结果并在下次访问同一常量条目时重用

    这并不意味着实现必须对每个类的常量池具有1:1的表示。一个特定的实现可能会将一个类的池映射到一个共享池,该共享池用于相同类加载上下文的所有类,其中每个符号引用解析为相同的目标

  • 还有字符串池,它可以看作是运行时常量池的一部分,保存对与字符串常量关联的所有
    string
    实例的引用,以允许将所有类的所有相同字符串常量解析为相同的
    string
    实例


  • 将为每个类创建常量池,还是仅为主类创建常量池?是在编译时间和运行时常量池都相同的情况下创建常量池,还是将编译常量池复制到运行时常量池?如上所述,它们对应,但不相同,由于运行时表示与字节码格式不同,例如字节码中的数字总是
    big-endian
    ,基于x68的系统在运行时使用
    little-endian
    ,字符串和符号在字节码中使用
    修改的UTF-8
    ,在运行时使用
    UTF-16
    ISO-LATIN-1
    ,此外,现有对象和数据结构的内存地址也将在运行时使用。您可能会将其视为延迟复制和转换操作。感谢您的解释。还有一个疑问是,运行时常量池被称为字符串池,或者字符串池是在单独的位置创建的?这取决于实现,但通常有两种不同的运行时数据结构;常量池组织为表,其索引对应于类文件中使用的索引,而字符串池是哈希表,对应于实际字符串内容。但它们为解析的字符串常量引用相同的字符串实例。