常量池之前是放在方法区里面的,也就是在永久代里面的,从JDK7开始移到了堆里面。这一改变我们可以从oracle的release version的notes里的** Important RFEs Addressed in JDK 7 **看到。
1 2 3 4 5 6 7 8 9 10 11
Area: HotSpot Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences. RFE: 6962931
String内存位置说明
1.显式的String常量
1 2
String a = "holten"; String b = "holten";
第一句代码执行后就在常量池中创建了一个值为holten的String对象;
第二句执行时,因为常量池中存在holten所以就不再创建新的String对象了。
此时该字符串的引用在虚拟机栈里面。
2.String对象
1 2
String a = new String("holtenObj"); String b = new String("holtenObj");