1. Java堆异常

不断创建新对象,而没有被GC回收,则出现该错误 OutOfMemoryError: Java Heap Space

package jvm.test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Kaiming Wan on 2015/11/3 0003.
 *
 * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOutOfMemoryError
 *
 * 避免堆自动扩展,设置最小堆等于最大堆等于20m,设置-XX:+HeapDumpOutOfMemoryError用于分析内存堆转储快照
 */
public class HeapOOM {


    static class OOMObject{

    }

    public static void main(String[] args){
        List<OOMObject> list = new ArrayList<OOMObject>();

        while (true){
            list.add(new OOMObject());
        }

    }
}

2. 虚拟机栈和本地栈溢出

-Xss参数设定本地方法栈容量
-Xoss 设定本地方法栈大小

一般都提示StackOverflow错误,如果不断创建线程,会出现OutOfMemoryError:unable to create new native thread

3. 方法区和运行时常量池溢出

方法区存放class相关的元信息。运行时产生大量的类,可以利用动态代理或反射时的GeneratedConstructorAccessor等。大量产生class的应用中比较容易出现这类错误。

PS:JDK1.7开始已经没永久代了。。。。

4. 本机直接内存溢出

DirectMemory 容量可以通过 -XX: MaxDirectMemorySize指定,如果不指定则默认堆最大值(-Xmx)。这类错误在Heap Dump中不会发现异常,OOM之后Dump文件比较小,如果直接或间接使用过NIO可能是这方面的问题。