类文件常量池
类文件结构概览
一个Java类文件的大致结构如下:
魔数(Magic Number):标识文件类型,值为0xCAFEBABE。
版本号(Version):次版本号和主版本号。
常量池(Constant Pool):包含常量池条目。
访问标志(Access Flags):类或接口的访问权限和属性。
类索引、超类索引、接口索引集合。
字段表(Fields Table):字段的定义。
方法表(Methods Table):方法的定义。
属性表(Attributes Table):类、字段、方法的附加信息。
类文件常量池的功能
- 在类加载和链接过程中,常量池中的符号引用被解析为具体的内存地址。类加载器在加载类时,使用常量池中的符号信息来解析和链接类的依赖关系。
- 这种符号解析机制使得编译后的字节码可以保持与源代码独立
运行时常量池
在类加载时,JVM会从类文件的常量池(Class File Constant Pool)中提取常量,并将它们存储在运行时常量池中。运行时常量池的功能和作用主要包括以下几点:
- 字符串常量池(String Pool)
字符串常量池(String Pool)是运行时常量池的一部分,专门用于存储字符串字面量。
从Java 7开始,字符串常量池确实被移到了堆内存中,不再存储在方法区(永久代)中 - 动态常量解析
运行时常量池支持动态常量解析,即在类加载和链接阶段,将符号引用解析为直接引用。 - 常量值缓存
运行时常量池缓存了静态常量值,如整数、浮点数、长整数和双精度浮点数。