測試Perm區溢位引起的OOM以及原因分析
Jdk版本:1.6.0_38
執行引數:-XX:PermSize=4M -XX:MaxPermSize=4M -verbose -verbose:gc-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
程式程式碼:
public static void main(String[] args) {
Random rnd = new Random();
List<String> interned = newArrayList<String>();
for (;;) {
int length = rnd.nextInt(100);
StringBuilder builder = newStringBuilder();
String chars ="abcdefghijklmnopqrstuvwxyz";
for ( int i = 0; i < length; i++) {
builder.append(chars.charAt(rnd.nextInt(chars.length())));
}
interned.add(builder.toString().intern());
}
}
執行結果:
導致永久記憶體區溢位,有兩種可能性:
1 String.intern(String)
這個方法建立的String是在永久記憶體堆上。當建立許多可reachable的這種String時,可能會導致永久記憶體區的溢位。
2
通過類載入器建立內部的建立的內部類描述符也是在永久記憶體堆上。如果你的類動態的載入了許多的類,並且這些物件不能執行gc,也有可能會導致永久記憶體區的溢位。