JavaGuide icon indicating copy to clipboard operation
JavaGuide copied to clipboard

常量池问题

Open yydzxz opened this issue 2 years ago • 1 comments

image 感觉对于字符串常量池和运行池的定义有问题

根据 周志明教授在这个issue https://github.com/fenixsoft/jvm_book/issues/112 的讨论 以及jdk源码的注释 image

所以我觉得,每个class文件都有自己的常量池表,这个是静态的。当class被加载后放到方法去,静态的常量池表就变成运行时常量池(jvm第三版47页),在这期间还可能动态的加入一些静态常量池表以前没有的东西。而针对字符串这种常量,为了节省开销,就统一由String类的运行时常量池管理。而其他每个类自己的运行时常量池,管理自己的符号常量之类的

yydzxz avatar Mar 04 '22 07:03 yydzxz

intern方法时如何使用的:

String s = new String("a"); s.intern(); intern是String自带的一个方法。

JDK6及之前调用intern方法时候如果字符串常量池先创建出该字符串对象,返回池中的该字符串的引用。否则将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。

JDK6+:调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用。否则如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在则池中创建该字符串并返回其引用。

简单总结一下:JDK6之后不仅在池中加载字符串对象,还会在Java堆中加载一份字符串对象。

引自本人博客:原文链接:https://blog.csdn.net/weixin_44240370/article/details/104065129

xtxxtxxtx avatar Mar 13 '22 03:03 xtxxtxxtx