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永久代已被移除