深入分析String.intern和String常量的实现原理
背景 字符串类型在实际应用场景中使用非常频繁,如果为每个字符串常量都生成一个对应的String对象,明显会造成内存的浪费,针对这一问题,虚拟机实现一个字符串常量池的概念,提供了如下实现: 1、同一个字符串常量,在常量池只有一份副本; 2、通过双引号声明的字符串,直接保存在常量池中; 3、如果是String对象,可以通过String.intern方法,把字符串常量保存到常量池中; 本文JVM源码版本 openjdk-7-fcs-src-b147-27 疑惑 在不同环境执行上述代码,会得到不同的结果,为什么? 1、JDK1.6的结果: false false 2、JDK1.7的结果: true false 解惑 其中 String.intern 在java中是native方法,JDK1.7的注释如下: 1、执行intern方法时,如果常量池中存在和String对象相同的字符串,则返回常量池中对应字符串的引用; 2、如果常量池中不存在对应的字符串,则添加该字符串到常量中,并返回字符串引用; HotSpot1.6实现 常量池的内存在永久代进行分配,永久代和Java堆的内存是物理隔离的,执行intern方法时,如果常量池不存在该字符串,虚拟机会在常量池中复制该字符串,并返回引用,使用intern方法时需要谨慎,避免常量池中字符串过多,导致性能变慢,甚至发生PermGen内存溢出。 显然 s