常量池与方法区的映射
Mapping of Constant pool and method Area
我想了解 class 文件是如何加载到方法区并执行的。我对常量池很困惑。
常量池最初是什么时候创建的?在编译时
class 文件或加载 class 时。
字节码在方法区是怎么组织的是什么方法table
包括?
- 任何人都可以显示素描中映射的图片表示
清晰理解方法区
编译Java文件时,所有对变量和方法的引用都作为符号引用存储在class的常量池中。
这里有一个link供您参考:What is the purpose of the Java Constant Pool?
- javac 在将源代码编译为 .class 文件时创建常量池。做
就可以看到
javap -v MyClass
给你的MyClass.class
- The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads.
您可以通过
查看 class 文件的字节码
'javap -c -v Main'
- 方法区只是堆的一部分,JVM 拥有关于此 class 的所有信息。
由于“constant pool”的字面意思就是“pool of constants”,所以名字有不同的东西,容易混淆
每个 class 文件都有一个 常量池 描述了 class 中使用的所有常量,其中包括常量值但也包括符号链接所需的参考。一些条目同时扮演这两个角色,例如class 条目可以用作对成员的符号引用的所有者声明,在访问字段或调用方法时需要,但也可以用于获取 Class
实例,例如对于出现在源代码中的 class 文字。由于它是 class 文件的一部分,其格式在 Java® 虚拟机规范,§4 class 文件格式 中指定§4.4. The Constant Pool.
正如其他答案所说,您可以使用命令 javap -v class.name
检查 class.
的常量池
运行时有对应的数据结构,也就是run-time constant pool。由于某些值表示为运行时对象(例如 String
、Class
、MethodType
或 MethodHandle
类型),并且符号引用必须解析为表示为 classes 和成员,此结构与 class 文件中的字节序列不同。但是这些条目是对应的,因此每次为常量实例化对象或解析符号引用时,都可以记住结果并在下一次访问相同的常量条目时重新使用。
这并不意味着实现必须具有每个 class 常量池的 1:1 表示。一个特定的实现可能将一个 class' 池映射到一个共享池,该共享池用于同一 class 加载上下文的所有 classes,其中每个符号引用解析到相同的目标。
还有字符串池,可以看作是运行时常量池的一部分,保存所有与字符串常量关联的String
实例的引用,允许解析所有相同的字符串常量所有 classes 到同一个 String
实例。
我想了解 class 文件是如何加载到方法区并执行的。我对常量池很困惑。
常量池最初是什么时候创建的?在编译时 class 文件或加载 class 时。
字节码在方法区是怎么组织的是什么方法table 包括?
- 任何人都可以显示素描中映射的图片表示 清晰理解方法区
编译Java文件时,所有对变量和方法的引用都作为符号引用存储在class的常量池中。
这里有一个link供您参考:What is the purpose of the Java Constant Pool?
- javac 在将源代码编译为 .class 文件时创建常量池。做 就可以看到
javap -v MyClass
给你的MyClass.class
- The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. 您可以通过 查看 class 文件的字节码
'javap -c -v Main'
- 方法区只是堆的一部分,JVM 拥有关于此 class 的所有信息。
由于“constant pool”的字面意思就是“pool of constants”,所以名字有不同的东西,容易混淆
每个 class 文件都有一个 常量池 描述了 class 中使用的所有常量,其中包括常量值但也包括符号链接所需的参考。一些条目同时扮演这两个角色,例如class 条目可以用作对成员的符号引用的所有者声明,在访问字段或调用方法时需要,但也可以用于获取
的常量池Class
实例,例如对于出现在源代码中的 class 文字。由于它是 class 文件的一部分,其格式在 Java® 虚拟机规范,§4 class 文件格式 中指定§4.4. The Constant Pool.
正如其他答案所说,您可以使用命令javap -v class.name
检查 class.运行时有对应的数据结构,也就是run-time constant pool。由于某些值表示为运行时对象(例如
String
、Class
、MethodType
或MethodHandle
类型),并且符号引用必须解析为表示为 classes 和成员,此结构与 class 文件中的字节序列不同。但是这些条目是对应的,因此每次为常量实例化对象或解析符号引用时,都可以记住结果并在下一次访问相同的常量条目时重新使用。这并不意味着实现必须具有每个 class 常量池的 1:1 表示。一个特定的实现可能将一个 class' 池映射到一个共享池,该共享池用于同一 class 加载上下文的所有 classes,其中每个符号引用解析到相同的目标。
还有字符串池,可以看作是运行时常量池的一部分,保存所有与字符串常量关联的
String
实例的引用,允许解析所有相同的字符串常量所有 classes 到同一个String
实例。