JAVA中常量池、运行时常量池、字符串常量池区别

JAVA中的常量池分为静态常量池、运行时常量池和字符串常量池。静态常量池存在于Class文件中,运行时常量池存储在内存方法区,用于存放加载后的常量数据。字符串常量池在Java 8及以后存放在堆中,用于共享相同的String字符串,通过intern()方法实现。三者之间关系紧密但各有特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA中静态常量池、运行时常量池、字符串常量池区别看上去很相近的概念容易混淆,区分如下(注意英文单词的区别

  • 静态常量池(Constant Pool)

        其实叫“Class文件常量池”比较贴切,就是磁盘中class文件中Constant Pool列表。 可以使用javap命令查看class文件(如下图)会列出class文件中的常量池。

  • 运行时常量池(Run-time Constant Pool)

        在内存中的常量池,既从Class文件加载后,将其常量数据放在内存中。具体而言是放在内存方法区Method Area中(Java7及以前为永久代,Java8及以后为MetaSpace元空间)。

       通常,再Run-time Constant Pool中除了保存来自class文件中的常量池数据(既字面符号引用),还会保存由符号引用翻译得到的直接引用。

        可以通过HSDB等工具查看内存各个数据,其中可以通过查看内存中Class的Constant pool就是Run-time Constant Pool。

      

  • 字符串常量池(StringTable)

        这个翻译为“String类型常量表”更合适,它存储以双引号包住的String字符串。通过StringTable可以实现相同的String字符串共享。  在Java 8,StringTable是存放在内存堆中。

    注意区分:上面的Constant Pool是存放:所有字面量内容,这里的字面量是远多于String的,如上图的Constant Pool(既Constant Pool是各种常量等字面量的合集,  而StringTable仅与java.lang.String有关。两者是不同的东西。

    HotSpot VM里,记录interned string的一个全局表叫做StringTable,它本质上就是个HashTable。常量表存储以双引号包住的String对象的地址引用,而不是String对象本身。具体见另一文章《JVM中字符串常量池StringTable在内存中形式分析》

 总上:静态常量池和运行时常量池两者关系十分密切;而字符串常量池(StringTable)是另一个东西。  从英文上看名字也可看出差异远近。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值