- 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)