JVM common abnormal cases

Disclaimer: This article is a blogger original article, shall not be reproduced without the bloggers allowed. https://blog.csdn.net/u013219624/article/details/89098603

1.JVM structure

线程共享:Java堆 直接内存 方法区(常量池,类信息)
线程私有:程序计数器 虚拟机栈 本地方法栈

2. heap memory OOM

-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m
java.lang.OutOfMemoryError: Java heap space

public static void main(String[] args) throws Exception {
    List<OOMDemo> oomDemoList = new ArrayList<>();
    while (true) {
        oomDemoList.add(new OOMDemo());
    }
}

3. SOE stack overflow

-Xss128k
java.lang.StackOverflowError

public static void main(String[] args) {
    SOEDemo soeDemo = new SOEDemo();
    soeDemo.leak();
}

private void leak() {
    int x = 0;
    leak();
}	

4. The metadata area OOM (JDK1.8)

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m
java.lang.OutOfMemoryError: Metaspace

public static void main(final String[] args) {
   while (true) {
       Enhancer enhancer = new Enhancer();
       enhancer.setSuperclass(MMSDemo.class);
       enhancer.setUseCache(false);
       enhancer.setCallback(new MethodInterceptor() {
           @Override
           public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
               return methodProxy.invokeSuper(o, objects);
           }
       });
       enhancer.create();
   }
}

If JDK1.7, there should be a permanent Generation (-XX: PermSize = 128m -XX: MaxPermSize = 128m)

5. Direct Memory OOM

-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m -XX:MaxDirectMemorySize=20m
java.lang.OutOfMemoryError

public static void main(String[] args) throws Exception {
    Field field = Unsafe.class.getDeclaredFields()[0];
    field.setAccessible(true);
    Unsafe unsafe = (Unsafe) field.get(null);
    while (true) {
        unsafe.allocateMemory(_1MB);
    }
}	

Guess you like

Origin blog.csdn.net/u013219624/article/details/89098603