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.8开始已经没永久代了。。。。
4. 本机直接内存溢出
DirectMemory 容量可以通过 -XX: MaxDirectMemorySize指定,如果不指定则默认堆最大值(-Xmx)。这类错误在Heap Dump中不会发现异常,OOM之后Dump文件比较小,如果直接或间接使用过NIO可能是这方面的问题。