测试环境

JDK Version : jdk-1_5_0_22
VM Options : -XX:PermSize=4M

测试代码

  1. package com.javabook.oom.germ;
  2. import java.util.Random;
  3. /**
  4. * -XX:PermSize=4M
  5. *
  6. * java.lang.OutOfMemoryError: PermGen space
  7. *
  8. * @author Summer Lu
  9. * @email gmluyang@gmail.com
  10. * @date 2014-8-25
  11. *
  12. */
  13. public class JvmOutOfMemoryErrorOfPermGenSpaceDemo {
  14. /**
  15. * @param args
  16. */
  17. public static void main(String[] args) {
  18. Random random = new Random();
  19. for(;;){
  20. random.toString().intern();
  21. }
  22. }
  23. }

VisualVM

JvmOOMEOfJavaGermSpaceMain.png

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();
      

      } } } ```

QQ录屏20210611122647.mp4