在测试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
运行参数:
代码:
运行结果:
未发生OOM 且在发生GC
发生OOM
1,为什么没OOM ,是因为java8 用 Metaspace 替换了 perm的原因么?
2,常量池一直在加字符常量,且被List持有。也没有其他对象产生,为什么会发生GC,在GC什么。看内存变化像是这些字符常量被回收了?