- Java堆溢出
public class HeapOOM {
static class OOMObject {
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
while (true) {
list.add(new OOMObject());
}
}
}
- 设置虚拟机参数
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\xxx\Desktop
- 异常以下
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
Heap dump file created [28207505 bytes in 0.158 secs]
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at HeapOOM.main(HeapOOM.java:15)
- 分析异常
- 将dump下来的堆转储快照文件导入Eclipse Memory Analyzer工具
- 点击Histogram查看类对象占用的空间大小,以下

- 程序经过不断的建立OOMObject对象,致使堆被迅速的占满,从而出现堆内存溢出
- 虚拟机栈和本地方法栈溢出
public class JavaVMStackSOF {
private int stackLength = 1;
public void stackLeak() {
stackLength++;
stackLeak();
}
public static void main(String[] args) {
JavaVMStackSOF oom = new JavaVMStackSOF();
try {
oom.stackLeak();
} catch (Exception e) {
System.out.println("stack length:" + oom.stackLength);
e.printStackTrace();
}
}
}
Exception in thread "main" java.lang.StackOverflowError
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:8)
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)
at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)
........
- 方法区和运行时常量池溢出
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}
- 虚拟机参数:
-Xms10m -Xmx10m
- 异常以下
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Integer.toString(Integer.java:403)
at java.lang.String.valueOf(String.java:3099)
at RuntimeConstantPoolOOM.main(RuntimeConstantPoolOOM.java:12)