测试环境
JDK Version : jdk-1_5_0_22
VM Options : -XX:PermSize=4M
测试代码
package com.javabook.oom.germ;
import java.util.Random;
/**
* -XX:PermSize=4M
*
* java.lang.OutOfMemoryError: PermGen space
*
* @author Summer Lu
* @email gmluyang@gmail.com
* @date 2014-8-25
*
*/
public class JvmOutOfMemoryErrorOfPermGenSpaceDemo {
/**
* @param args
*/
public static void main(String[] args) {
Random random = new Random();
for(;;){
random.toString().intern();
}
}
}
VisualVM
Console
Error occurred during initialization of VM
java.lang.OutOfMemoryError: PermGen space
at java.io.Win32FileSystem.hashCode(Win32FileSystem.java:598)
at java.io.File.hashCode(File.java:2102)
at java.util.HashMap.hash(HashMap.java:362)
at java.util.HashMap.put(HashMap.java:492)
at sun.misc.MetaIndex.registerDirectory(MetaIndex.java:191)
at sun.misc.Launcher$ExtClassLoader$1.run(Launcher.java:146)
at sun.misc.Launcher$ExtClassLoader$1.run(Launcher.java:142)
at java.security.AccessController.doPrivileged(Native Method)
at sun.misc.Launcher$ExtClassLoader.getExtClassLoader(Launcher.java:141)
at sun.misc.Launcher.<init>(Launcher.java:71)
at sun.misc.Launcher.<clinit>(Launcher.java:57)
at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1489)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1474)
其他
在一些版本更高的JDK中,可能无法复现上面的错误,字符串常量已经不再分配在PermGen space,而是在堆上,因此会频繁的触发PSYoungGen和Full GC
- -Xms2m -Xmx2m -XX:MaxMetaspaceSize=16M -XX:+PrintGCDetails ```java package online.javabook.jvm.gc.oom.metaspace;
import net.sf.cglib.beans.BeanGenerator;
import java.lang.management.ClassLoadingMXBean; import java.lang.management.ManagementFactory; import java.util.Random;
/**
- https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html *
- -Xms2m -Xmx2m -XX:MaxMetaspaceSize=2M -XX:+PrintGCDetails
- Error occurred during initialization of VM
- OutOfMemoryError: Metaspace *
- JDK8中使用了Metaspace区代替了JDK7中的永生区 *
- @author Summer Lu
- @email gmluyang@gmail.com
@date 2014-8-25 */ public class JvmOutOfMemoryErrorOfMetaSpaceDemo2 {
/**
@param args */ public static void main(String[] args) throws ClassNotFoundException {
Random random = new Random(); for(;;){
random.toString().intern();
} } } ```