Java 常量池和方法区域的映射
我试图理解类文件是如何加载到方法区域并执行的。我对这个恒定的游泳池感到非常困惑Java 常量池和方法区域的映射,java,jvm,classloader,Java,Jvm,Classloader,我试图理解类文件是如何加载到方法区域并执行的。我对这个恒定的游泳池感到非常困惑 初始创建常量池的时间?在编制 类文件或加载类时 字节码在方法区域中的组织方式方法表 包括 有人能在草图中显示地图的图片表示吗 清晰理解的方法区域 编译Java文件时,对变量和方法的所有引用都作为符号引用存储在类的常量池中 以下是供您参考的链接: 当您将源代码编译为.class文件时,javac会创建一个常量池。你可以看到它,如果你做 javap-vmyclass 给你的班级 您可以通过以下方式查看类文件的字节码:
编译Java文件时,对变量和方法的所有引用都作为符号引用存储在类的常量池中 以下是供您参考的链接:
因为“常量池”的字面意思只是“常量池”,所以名称中有不同的东西,很容易混淆
正如其他答案所说,您可以使用命令
javap-vclass.name
检查类的常量池
String
、Class
、MethodType
或MethodHandle
),符号引用必须解析为所表示的类和成员的运行时表示,此结构与类文件中的字节序列不同。但这些条目是对应的,因此每次为常量实例化对象或解析符号引用时,都可以记住结果并在下次访问同一常量条目时重用
这并不意味着实现必须对每个类的常量池具有1:1的表示。一个特定的实现可能会将一个类的池映射到一个共享池,该共享池用于相同类加载上下文的所有类,其中每个符号引用解析为相同的目标
string
实例的引用,以允许将所有类的所有相同字符串常量解析为相同的string
实例
将为每个类创建常量池,还是仅为主类创建常量池?是在编译时间和运行时常量池都相同的情况下创建常量池,还是将编译常量池复制到运行时常量池?如上所述,它们对应,但不相同,由于运行时表示与字节码格式不同,例如字节码中的数字总是
big-endian
,基于x68的系统在运行时使用little-endian
,字符串和符号在字节码中使用修改的UTF-8
,在运行时使用UTF-16
和ISO-LATIN-1
,此外,现有对象和数据结构的内存地址也将在运行时使用。您可能会将其视为延迟复制和转换操作。感谢您的解释。还有一个疑问是,运行时常量池被称为字符串池,或者字符串池是在单独的位置创建的?这取决于实现,但通常有两种不同的运行时数据结构;常量池组织为表,其索引对应于类文件中使用的索引,而字符串池是哈希表,对应于实际字符串内容。但它们为解析的字符串常量引用相同的字符串实例。