JDK1.6代码运行及其结果
/**
* VM options:-Xms10M -Xmx20M -XX:PermSize=10M -XX:MaxPermSize=10M -XX:-UseGCOverheadLimit
*/
public class StringIntern {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
int i = 0;
while(true){
list.add(String.valueOf(i++).intern());
}
}
}
JDK1.7代码运行及其结果
/**
* VM options:-Xms10M -Xmx20M -XX:PermSize=10M -XX:MaxPermSize=10M -XX:-UseGCOverheadLimit
*/
public class StringIntern {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
int i = 0;
while(true){
list.add(String.valueOf(i++).intern());
}
}
}

从上面的Java6,Java7,Java8的运行结果可以看出,在Java6时抛出永久代异常,说明运行时常量池存在于方法区,在Java7中抛出堆异常,说明运行时常量池此时在Java堆中了,Java8不支持PerSize永久代的参说设置,Java8永久代已被移除
本文通过示例代码展示了从Java 6到Java 8中字符串常量池位置的变化,从方法区到堆内存,并指出Java 8已移除永久代。
1060





