朝阳前的黑暗 2022-03-18 16:30
浏览 37
已结题

java8 设定MaxPermSize=2M 不停String.intern().未发生OOM

问题遇到的现象和发生背景

在测试PermSize OOM是看到一个实例。指定-XX:MaxPerSize=2M 然后执行

public class PermOOM {

public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    while (true) {
        list.add(UUID.randomUUID().toString().intern());
    }
}

}

预期出现 :
系统溢出后打印的异常栈:
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
at test.classloader.PermOOM.main(PermOOM.java:20)

但是实际并未出现。代码能一直运行下去。
然后添加 运行参数 -XX:+PrintGC
发现一直在GC

问题相关代码,请勿粘贴截图

运行参数:

img

代码:

img

运行结果:

img

运行结果及报错内容

未发生OOM 且在发生GC

我想要达到的结果

发生OOM

我的疑惑

1,为什么没OOM ,是因为java8 用 Metaspace 替换了 perm的原因么?
2,常量池一直在加字符常量,且被List持有。也没有其他对象产生,为什么会发生GC,在GC什么。看内存变化像是这些字符常量被回收了?

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 创建了问题 3月18日