运行时常量池

运行时常量池

概念: 属于方法区的一部分 Class 文件中含有常量池表(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容加载之后放到方法区的运行时常量池中。

(1)Class 常量池 (又称常量池) : 主要用于存放两大类常量: 字面量(Literal) 和符号引用量(Symbolic References)。

字面量相当于 Java 语言层面常量的概念, 如文本字符串,声明为 final 的常量值等;

符号引用则属于编译原理方面的概念,包括了三种类型的常量: 类和接口的全限定名、字段名称和描述符、方法名称和描述符。

image.png

(2)运行时常量池: 当类加载到内存中后,jvm 会将 class 常量池中的内容存放到运行时常量中。经过解析(resolve)之后,把符号引用替换为直接引用,解析的过程去查询全局字符串池,也就是 StringTable,来保证运行时常量池所引用的字符串与全剧字符串池中所引用的一致。

(3)字符串常量池(String 常量池,串池,StringTable):类似的 Integer、Long 常量池,属于运行时常量池的一部分(VM 中有且只有一个,被所有类共享),目的是为了分担运行时常量池的工作。

JDK1.8 之后常量池在 元空间中属于本地内存,但 StringTable 在堆 heap 中

image.png

特点

动态性: 相对于 Class 文件的常量池来说,具有动态性, 并非预置入 Class 文件中常量池的内容才能进行方法区的运行时常量池,在运行期间也是可以将新的常量放入池中,例如 String 的 intern() 方法。

运行时常量池时方法区的一部分,也会存在 OutOfMemoryError 异常,但是由于 JDK1.8 后的方法区存放在元空间中,所以不容易出现 OutOfMemoryError 异常。

Demo:

public class Demo04 {

public static void main(String[] args) {

String s1 = "a";

String s2 = "b";

String s3 = "a" + "b";//S3 在编译时期就确定了结果为 “ab”(编译优化)

String s4 = "ab";

String s5 = s1 + s2;

System.out.println(s3 == s4);

System.out.println(s3 == s5);

System.out.println(s4 == s5);

}

}

结果:true false false

String 比较对象时比较的是地址。

使用 javap 反编译后

image.png
image.png

可以看到

image.png

s3 与 s4 这些都是从常量池的 #11 中取的 ab 地址是同一个

后面的使用 StringBuilder 的 append 方法拼接。StringBuilder 是个对象,存在堆中与常量池的地址不同。

同样思考:

String s1 = new String(“a”)+ new String(“b”);

String s2 = s1.intern();

String s3=”ab”;

s1==s2

s1==s3

s2==”ab”

的结果

总结:

(1) 常量池中的字符串仅仅是个符号, 第一次用到时才会变为对象。

(2) 利用串池机制,优化重复创建字符串。

(3) 字符串变量拼接原理 StringBuilder append(JDK1.8)。

(4) 字符串常量拼接原理时编译优化。

(5) 可以使用 intern 方法,主动将串池中还没放入的字符串对象放入串池中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容