运行时常量池与Class类文件常量池

一.运行时常量池(Runtime Constant Pool)

1.方法区的一部分,因此受到内存限制,当无法再申请内存时会抛OutOfMemoryError异常

2.Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池(Constant Pool Table)

3.常量池表(Constant Pool Table):

①用于存放编译期生成的各种字面量符号引用

②这部分内容将在类加载后存放到方法区的运行时常量池

4.不同的提供商实现的虚拟机可以按照自己的需求来实现这个内存区域

5.除了保存Class文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中

6.动态性

并不要求常量一定只有编译期才能产生

并非预置如Class文件中常量池的内容才能进入方法区运行时常量池,运行期也可将新的常量放入池内,用得较多的时String类的intern()方法

二.Class类文件常量池

1.比喻为Class文件里的资源仓库,它是Class文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一

2.常量池中数量不固定,入口需放置一项u2类型的数据来代表常量池容量计数值(constant_pool_count)(从1开始而不是从0)

3.主要存放两大类常量:字面量(Literal)符号引用(Symbolic References)

字面量:比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值

符号引用:属于编译原理方面的概念

(1)被模板导出或者开放的包(package)

(2)类和接口的全限定名(Fully Qualified Name)

(3)字段的名称和描述符(Descriptor)

(4)方法的名称和描述符

(5)方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)

(6)动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)
4.在Class文件中不会保存各个方法、字段最终在内存中的布局信息,这些字段、方法的符号引用需在运行期进行转换得到真正的内存入口地址

5.但JVM做类加载时,①将会从常量池获得对应的符号引用 ②在类创建时或运行时解析、翻译到具体的内存地址中

6.常量池项目类型

java 常量池和运行时常量池 常量池与运行时常量池_JVM


7.专门用于分析Class字节码工具:javap