分别在JDK1.6与1JDK1.7中运行以下代码
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
int i = 0;
while (true) {
// intern 方法保证其加入到常量池中
//System.out.println(i);
list.add(String.valueOf(i++).intern());
}
}
JDK1.6
设置启动参数
-XX:PermSize=5M 方法区最小内存
-XX:MaxPermSize=5M 方法区最大内存
运行结果
结论:方法区内存溢出,常量池在方法区
JDK1.7
设置启动参数
-XX:PermSize=5M 方法区最小内存
-XX:MaxPermSize=5M 方法区最大内存
运行结果:
在JDK1.7的环境中不会出现内存溢出
结论:常量池不在方法区中
总结:在JDK1.6环境下常量池在方法区,在JDK1.7+环境下常量池在堆里面。