package com.brianway.learning.java.jvm.memory;
import java.util.ArrayList;
import java.util.List;
/**
* Created by brian on 17/3/2.
* 运行时常量池导致的内存溢出异常
* VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
*
* 这两个配置项在 JDK 1.8 已经不支持了
*/
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
testEqual();
//使用 List 保持着常量引用,避免被 Full GC 回收常量池行为
List<String> list = new ArrayList<>();
//10MB 的 PermSize 在 integer 范围内足够产生 OOM 了
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
/**
* JDK 1.8
* true
* false
* intern()不会再复制实例,只是在常量池中记录首次出现的实例引用
*/
private static void testEqual(){
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);// true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2);// false
}
}
/*
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=10M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=10M; support was removed in 8.0
*/