我知道"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可能会适得其反。

07-24 09:36
查看更多