我知道"a"
和new String("b")
都将在常量池中创建"a"
或"b"
但是,为什么下面的程序不抛出outOfMemoryError
?new String("b")
在常量池中不创建任何内容吗?
List<String> s = new ArrayList<String>();
// -XX:PermSize=5M
// -XX:MaxPermSize=5M
// why no oom:pergen space throw???? "i" isn't in constant pool????
for (;;) {
for (int i = 0; i < 1000000; i++) {
s.add(new String("" + i));
}
}
最佳答案
new String(...)在普通堆中创建对象,因此限制永久生成不会触发OOME。
使用较旧版本的Java,您可以通过在结果字符串上调用.intern()来模拟它,但是即使最近它也发生了变化(有关详细信息,请阅读http://java-performance.info/string-intern-in-java-6-7-8/)。
在Java 8中,烫发生成似乎已完全消失
http://www.infoq.com/articles/Java-PERMGEN-Removed
因此,除非您专门针对较旧的版本,否则尝试找到其限制并尝试理解Metaspace可能会适得其反。