JVM常量池/运行时常量池/字符串常量池理解

常量池

java文件编译成.class字节码文件后,会生成一个Constant pool的类目,这就是常量池。它存储在磁盘上,比如我的是D盘目录下。

符号引用包括

  • 类和接口的全限定名

    #2 = Class              #63            // java/util/ArrayList
    
  • 字段的名称和描述符

    #4 = Fieldref           #18.#64        // com/xxx/config/UrlConfig.captchaUrl:Ljava/util/List;
    
  • 方法的名称和描述符

     #3 = Methodref          #2.#62         // java/util/ArrayList."<init>":()V
    

在这里插入图片描述

运行时常量池

JVM将.class文件加载后,在方法区会开辟一个运行时常量池,将Constant pool复制到运行时常量池中,在方法被调用后,将运行时常量池的符号引用,转换为虚拟机栈帧中的直接引用,即内存中的真实地址。
JVM为每一个加载的类和接口创建并维护一个运行时常量池,通过索引访问。
在这里插入图片描述

字符串常量池

为避免频繁的创建字符串带来的性能损耗,JVM为字符串开辟了字符串常量池,类似于缓存区。存在于JVM堆中

String s1 = "123";
String s2 = "123";
System.out.println(s1 == s2);  // true


在这里插入图片描述
参考:https://blog.csdn.net/weixin_42679575/article/details/128021153

字符串常量池位置变迁

  • Jdk1.6及之前: 有永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池

  • Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里

  • Jdk1.8及之后: 无永久代,运行时常量池在元空间,字符串常量池里依然在堆里
    在这里插入图片描述
    参考: https://www.cnblogs.com/dtyy/p/15881493.html

总结

  • 常量池在.class文件的字节码中,在磁盘上
  • 运行时常量池在JVM的方法区中,.class文件被加载进JVM后,复制常量池到运行时常量池,并将符号引用替换为直接引用;JVM为每一个加载的类和接口创建并维护一个运行时常量池,通过索引访问
  • 字符串常量池存在于JVM堆中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值