Java的常量池

本文介绍了Java中的常量池概念,区分了静态常量池与运行时常量池的不同,并解释了它们在Java类文件结构及虚拟机加载过程中的作用。

ava中的常量池,实际上分为两种形态:静态常量池运行时常量池

     所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

     而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。

Java 开发中,常量池是一个至关重要的概念,贯穿于程序的编译、加载以及运行过程,不同版本的 JVM 中,常量池是优化内存使用和提高性能的重要机制。以 JDK 11 为例,常量池主要包括静态常量池、运行时常量池、基础类型常量池和字符串常量池 [^1][^2]。 ### Class 常量池 Class 常量池是 .java 文件编译后的静态信息,它主要包括字面量和符号引用。例如以下代码: ```java public class ClassConstantTest { private final String name = "Tom"; private final int age = 18; private String sk = "sk.com"; private int salary = 10000000; public String getName() { return name; } public int getAge() { return age; } public String getSk() { return sk; } public int getSalary() { return salary; } } ``` 此代码编译后的 Class 文件常量池就包含了 `name`、`age` 等字面量,以及方法名、类名等符号引用 [^1][^3]。 ### 运行时常量池 当 Class 常量池的信息在运行时被加载到内存后,就变成了运行时常量池。对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用,即动态链接。例如,某个符号引用在运行时会被转变为具体代码在内存中的地址,主要通过对象头里的类型指针去转换直接引用 [^4]。 ### 字符串常量池 字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。作为最基础的数据类型,大量频繁的创建字符串,会极大程度地影响程序的性能。JVM 为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为字符串开辟一个字符串常量池,类似于缓存区。创建字符串常量时,首先查询字符串常量池是否存在该字符串。若存在该字符串,返回引用实例;若不存在,则实例化该字符串并放入池中 [^4]。 ### 静态常量池 静态常量池Java 常量池的一种,它存储了类的相关静态信息,是常量池机制的一部分,有助于 JVM 对类信息的管理和使用 [^2]。 ### 基础类型常量池Java JVM 中,基础类型常量池也是常量池的一部分,不过引用中未详细提及它的具体内容 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值