Java字符串常量池:无引用的字面量会留存整个应用生命周期吗?
关于Java字符串常量池的这个问题,我来给你理清楚
嘿,这个问题问到点子上了,咱们一步步拆解:
首先看你给出的代码:
String greeting = "Hello" + "World";
先搞懂编译期优化
Java编译器会做常量折叠优化——也就是说,编译这行代码的时候,"Hello" + "World"会被直接转换成单一的字符串字面量"HelloWorld"。所以编译后的class文件里,只会存在"HelloWorld"这个常量项,根本不会有单独的"Hello"和"World"的引用。
回到你的核心问题
那这两个字面量会不会在应用生命周期里保留?得分两种情况:
- 如果代码里没有其他地方用到
"Hello"或"World":那编译器根本不会把这两个字面量加入到class文件的常量池中,运行时自然也不会出现在字符串常量池里,更谈不上“保留”了。 - 如果代码里其他地方用到了这两个字面量:比如别的方法里写了
String s = "Hello";,那这两个字面量会被加载到字符串常量池中。在大多数HotSpot VM的实现中,字符串常量池位于元空间(Java 8及以后)或永久代(Java 7及以前),这些区域的垃圾回收频率很低,通常只要应用还在运行,这些字符串常量就会一直保留。不过也有特殊情况:比如启用了字符串去重功能,或者VM在某些极端内存压力下触发了常量池的清理,但这种情况非常少见。
总结一下:如果只有你给出的这一行代码,那"Hello"和"World"根本不会进入常量池;如果其他地方用到了它们,那通常会在应用整个生命周期里保留在常量池中。
内容的提问来源于stack exchange,提问作者CrazySynthax
相关产品推荐
相关产品推荐

