Java堆溢出
import java.util.ArrayList;
import java.util.List;
/**
* -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
* 限制Java堆的大小为20M,不可扩展
* @author renyj
*
*/
public class OOMTest {
static class OOMObject{
}
public static void main(String[] args) {
List<OOMObject> objs = new ArrayList<>();
while(true) {
objs.add(new OOMObject());
}
}
}
// 运行结果
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid16556.hprof ...
Heap dump file created [28122391 bytes in 0.161 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Java堆的作用是存储对象实例,不断创建对象,并使垃圾回收机制不回收这些对象,当对象数量超过最大堆的容量限制后,就会产生OutOfMemory异常。
异常信息中的java.lang.OutOfMemoryError: Java heap space
则表示在Java堆中发生了OOM异常。要分析异常,先判断此为内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。
内存泄漏:垃圾收集器无法自动回收已创建对象。
内存溢出:申请的内存大于系统能给的内存。
虚拟栈和本地方法栈溢出
- StackOverflowError:线程请求的栈深度大于虚拟机所允许的最大深度。
- OutOfMemoryError:虚拟机在扩展栈时无法申请到足够的内存空间。
/**
* -Xss128k
* @author renyj
*
*/
public class JavaVMStackSOF {
private int stackLength = 1;
public static void main(String[] args) throws Throwable {
JavaVMStackSOF oom = new JavaVMStackSOF();
try {
oom.stackLeak();
} catch (Throwable e) {
System.out.println("stacklength==================" + oom.stackLength);
throw e;
}
}
private void stackLeak() {
stackLength++;
stackLeak();
}
}
// result
stacklength==================981
Exception in thread "main" java.lang.StackOverflowError
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:20)
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:21)
网友评论