JVM OOM故障排查演示
import java.util.ArrayList;
import java.util.List;
public class OOMDemo {
// 模拟占用内存的对象,每个实例包含一个 1MB 的字节数组
static class OOMObject {
private byte[] memory = new byte[1024 * 1024];
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
System.out.println("应用启动,开始分配内存...");
int count = 0;
try {
while (true) {
list.add(new OOMObject());
count++;
}
} catch (OutOfMemoryError e) {
System.out.println("发生 OOM!共创建了 " + count + " 个对象。");
e.printStackTrace();
}
}
}

带上虚拟机参数在运行
-Xms20m堆内存最小20mb-Xmx20m堆内存最大20mb-XX:+HeapDumpOnOutOfMemoryErrorOOM是导出堆内存快照-XX:HeapDumpPath=./oom-dump.hprof快照文件的导出路径-Xlog:gc*打印GC日志

C:\Users\Admin\.jdks\ms-17.0.16\bin\java.exe -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./oom-dump.hprof "-Xlog:gc*" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2025.2.2\lib\idea_rt.jar=60669" -Dfile.encoding=UTF-8 -classpath E:\求职\练习\JVM\JVM\target\classes org.dztyykxx.OOM.OOMDemo
[0.007s][info][gc] Using G1
[0.007s][info][gc,init] Version: 17.0.16+8-LTS (release)
[0.007s][info][gc,init] CPUs: 12 total, 12 available
[0.007s][info][gc,init] Memory: 32374M
[0.007s][info][gc,init] Large Page Support: Disabled
[0.007s][info][gc,init] NUMA Support: Disabled
[0.007s][info][gc,init] Compressed Oops: Enabled (32-bit)
[0.007s][info][gc,init] Heap Region Size: 1M
[0.007s][info][gc,init] Heap Min Capacity: 20M
[0.007s][info][gc,init] Heap Initial Capacity: 20M
[0.008s][info][gc,init] Heap Max Capacity: 20M
[0.008s][info][gc,init] Pre-touch: Disabled
[0.008s][info][gc,init] Parallel Workers: 10
[0.008s][info][gc,init] Concurrent Workers: 3
[0.008s][info][gc,init] Concurrent Refinement Workers: 10
[0.008s][info][gc,init] Periodic GC: Disabled
[0.012s][info][gc,metaspace] CDS archive(s) mapped at: [0x000001d9a4000000-0x000001d9a4bb0000-0x000001d9a4bb0000), size 12255232, SharedBaseAddress: 0x000001d9a4000000, ArchiveRelocationMode: 1.
[0.012s][info][gc,metaspace] Compressed class space mapped at: 0x000001d9a5000000-0x000001d9e5000000, reserved size: 1073741824
[0.012s][info][gc,metaspace] Narrow klass base: 0x000001d9a4000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
应用启动,开始分配内存...
[0.057s][info][gc,start ] GC(0) Pause Young (Concurrent Start) (G1 Humongous Allocation)
[0.057s][info][gc,task ] GC(0) Using 2 workers of 10 for evacuation
[0.058s][info][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.0ms
[0.058s][info][gc,phases ] GC(0) Merge Heap Roots: 0.0ms
[0.058s][info][gc,phases ] GC(0) Evacuate Collection Set: 0.8ms
[0.058s][info][gc,phases ] GC(0) Post Evacuate Collection Set: 0.2ms
[0.058s][info][gc,phases ] GC(0) Other: 0.2ms
[0.058s][info][gc,heap ] GC(0) Eden regions: 2->0(2)
[0.058s][info][gc,heap ] GC(0) Survivor regions: 0->1(2)
[0.058s][info][gc,heap ] GC(0) Old regions: 0->0
[0.058s][info][gc,heap ] GC(0) Archive regions: 0->0
[0.058s][info][gc,heap ] GC(0) Humongous regions: 8->8
[0.058s][info][gc,metaspace] GC(0) Metaspace: 428K(640K)->428K(640K) NonClass: 402K(512K)->402K(512K) Class: 26K(128K)->26K(128K)
[0.058s][info][gc ] GC(0) Pause Young (Concurrent Start) (G1 Humongous Allocation) 9M->9M(20M) 1.304ms
[0.058s][info][gc,cpu ] GC(0) User=0.00s Sys=0.00s Real=0.00s
[0.058s][info][gc ] GC(1) Concurrent Undo Cycle
[0.058s][info][gc,marking ] GC(1) Concurrent Cleanup for Next Mark
[0.058s][info][gc,marking ] GC(1) Concurrent Cleanup for Next Mark 0.072ms
[0.058s][info][gc ] GC(1) Concurrent Undo Cycle 0.091ms
[0.058s][info][gc,start ] GC(2) Pause Young (Concurrent Start) (G1 Humongous Allocation)
[0.058s][info][gc,task ] GC(2) Using 2 workers of 10 for evacuation
[0.059s][info][gc,phases ] GC(2) Pre Evacuate Collection Set: 0.0ms
[0.059s][info][gc,phases ] GC(2) Merge Heap Roots: 0.0ms
[0.059s][info][gc,phases ] GC(2) Evacuate Collection Set: 0.6ms
[0.059s][info][gc,phases ] GC(2) Post Evacuate Collection Set: 0.1ms
[0.059s][info][gc,phases ] GC(2) Other: 0.1ms
[0.059s][info][gc,heap ] GC(2) Eden regions: 1->0(2)
[0.059s][info][gc,heap ] GC(2) Survivor regions: 1->1(1)
[0.059s][info][gc,heap ] GC(2) Old regions: 0->1
[0.059s][info][gc,heap ] GC(2) Archive regions: 0->0
[0.059s][info][gc,heap ] GC(2) Humongous regions: 10->10
[0.059s][info][gc,metaspace] GC(2) Metaspace: 430K(640K)->430K(640K) NonClass: 403K(512K)->403K(512K) Class: 26K(128K)->26K(128K)
[0.059s][info][gc ] GC(2) Pause Young (Concurrent Start) (G1 Humongous Allocation) 11M->11M(20M) 0.881ms
[0.059s][info][gc,cpu ] GC(2) User=0.00s Sys=0.00s Real=0.00s
[0.059s][info][gc ] GC(3) Concurrent Mark Cycle
[0.059s][info][gc,marking ] GC(3) Concurrent Clear Claimed Marks
[0.059s][info][gc,marking ] GC(3) Concurrent Clear Claimed Marks 0.004ms
[0.059s][info][gc,marking ] GC(3) Concurrent Scan Root Regions
[0.060s][info][gc,marking ] GC(3) Concurrent Scan Root Regions 0.449ms
[0.060s][info][gc,start ] GC(4) Pause Young (Normal) (G1 Humongous Allocation)
[0.060s][info][gc,marking ] GC(3) Concurrent Mark
[0.060s][info][gc,task ] GC(4) Using 2 workers of 10 for evacuation
[0.060s][info][gc,marking ] GC(3) Concurrent Mark From Roots
[0.060s][info][gc,task ] GC(3) Using 3 workers of 3 for marking
[0.060s][info][gc,phases ] GC(4) Pre Evacuate Collection Set: 0.1ms
[0.060s][info][gc,phases ] GC(4) Merge Heap Roots: 0.0ms
[0.060s][info][gc,phases ] GC(4) Evacuate Collection Set: 0.1ms
[0.060s][info][gc,phases ] GC(4) Post Evacuate Collection Set: 0.1ms
[0.060s][info][gc,phases ] GC(4) Other: 0.1ms
[0.060s][info][gc,heap ] GC(4) Eden regions: 1->0(1)
[0.060s][info][gc,heap ] GC(4) Survivor regions: 1->1(1)
[0.060s][info][gc,heap ] GC(4) Old regions: 1->1
[0.060s][info][gc,heap ] GC(4) Archive regions: 0->0
[0.060s][info][gc,heap ] GC(4) Humongous regions: 16->16
[0.060s][info][gc,metaspace] GC(4) Metaspace: 436K(640K)->436K(640K) NonClass: 408K(512K)->408K(512K) Class: 27K(128K)->27K(128K)
[0.060s][info][gc ] GC(4) Pause Young (Normal) (G1 Humongous Allocation) 17M->16M(20M) 0.241ms
[0.060s][info][gc,cpu ] GC(4) User=0.00s Sys=0.00s Real=0.00s
[0.060s][info][gc,marking ] GC(3) Concurrent Mark From Roots 0.284ms
[0.060s][info][gc,marking ] GC(3) Concurrent Preclean
[0.060s][info][gc,marking ] GC(3) Concurrent Preclean 0.048ms
[0.060s][info][gc,start ] GC(5) Pause Young (Normal) (G1 Evacuation Pause)
[0.060s][info][gc,task ] GC(5) Using 2 workers of 10 for evacuation
[0.060s][info][gc,phases ] GC(5) Pre Evacuate Collection Set: 0.0ms
[0.060s][info][gc,phases ] GC(5) Merge Heap Roots: 0.0ms
[0.060s][info][gc,phases ] GC(5) Evacuate Collection Set: 0.1ms
[0.060s][info][gc,phases ] GC(5) Post Evacuate Collection Set: 0.1ms
[0.060s][info][gc,phases ] GC(5) Other: 0.0ms
[0.060s][info][gc,heap ] GC(5) Eden regions: 0->0(2)
[0.060s][info][gc,heap ] GC(5) Survivor regions: 1->0(0)
[0.060s][info][gc,heap ] GC(5) Old regions: 1->1
[0.060s][info][gc,heap ] GC(5) Archive regions: 0->0
[0.060s][info][gc,heap ] GC(5) Humongous regions: 18->18
[0.060s][info][gc,metaspace] GC(5) Metaspace: 436K(640K)->436K(640K) NonClass: 409K(512K)->409K(512K) Class: 27K(128K)->27K(128K)
[0.060s][info][gc ] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 18M->18M(20M) 0.252ms
[0.060s][info][gc,cpu ] GC(5) User=0.00s Sys=0.00s Real=0.00s
[0.060s][info][gc,start ] GC(3) Pause Remark
[0.061s][info][gc ] GC(3) Pause Remark 18M->18M(20M) 0.209ms
[0.061s][info][gc,cpu ] GC(3) User=0.00s Sys=0.00s Real=0.00s
[0.061s][info][gc,marking ] GC(3) Concurrent Mark 0.903ms
[0.061s][info][gc,marking ] GC(3) Concurrent Rebuild Remembered Sets
[0.061s][info][gc,marking ] GC(3) Concurrent Rebuild Remembered Sets 0.003ms
[0.061s][info][gc,start ] GC(6) Pause Young (Normal) (G1 Humongous Allocation)
[0.061s][info][gc,task ] GC(6) Using 2 workers of 10 for evacuation
[0.061s][info][gc,phases ] GC(6) Pre Evacuate Collection Set: 0.0ms
[0.061s][info][gc,phases ] GC(6) Merge Heap Roots: 0.0ms
[0.061s][info][gc,phases ] GC(6) Evacuate Collection Set: 0.0ms
[0.061s][info][gc,phases ] GC(6) Post Evacuate Collection Set: 0.1ms
[0.061s][info][gc,phases ] GC(6) Other: 0.0ms
[0.061s][info][gc,heap ] GC(6) Eden regions: 1->0(3)
[0.061s][info][gc,heap ] GC(6) Survivor regions: 0->0(0)
[0.061s][info][gc,heap ] GC(6) Old regions: 1->1
[0.061s][info][gc,heap ] GC(6) Archive regions: 0->0
[0.061s][info][gc,heap ] GC(6) Humongous regions: 18->18
[0.061s][info][gc,metaspace] GC(6) Metaspace: 447K(640K)->447K(640K) NonClass: 418K(512K)->418K(512K) Class: 28K(128K)->28K(128K)
[0.061s][info][gc ] GC(6) Pause Young (Normal) (G1 Humongous Allocation) 18M->18M(20M) 0.239ms
[0.061s][info][gc,cpu ] GC(6) User=0.00s Sys=0.00s Real=0.00s
[0.061s][info][gc,ergo ] Attempting full compaction
[0.061s][info][gc,start ] GC(7) Pause Full (G1 Compaction Pause)
[0.061s][info][gc,task ] GC(7) Using 2 workers of 10 for full compaction
[0.061s][info][gc,phases,start] GC(7) Phase 1: Mark live objects
[0.062s][info][gc,phases ] GC(7) Phase 1: Mark live objects 0.603ms
[0.062s][info][gc,phases,start] GC(7) Phase 2: Prepare for compaction
[0.062s][info][gc,phases ] GC(7) Phase 2: Prepare for compaction 0.168ms
[0.062s][info][gc,phases,start] GC(7) Phase 3: Adjust pointers
[0.062s][info][gc,phases ] GC(7) Phase 3: Adjust pointers 0.324ms
[0.062s][info][gc,phases,start] GC(7) Phase 4: Compact heap
[0.063s][info][gc,phases ] GC(7) Phase 4: Compact heap 0.193ms
[0.063s][info][gc,heap ] GC(7) Eden regions: 0->0(1)
[0.063s][info][gc,heap ] GC(7) Survivor regions: 0->0(0)
[0.063s][info][gc,heap ] GC(7) Old regions: 1->1
[0.063s][info][gc,heap ] GC(7) Archive regions: 0->0
[0.063s][info][gc,heap ] GC(7) Humongous regions: 18->18
[0.063s][info][gc,metaspace ] GC(7) Metaspace: 447K(640K)->447K(640K) NonClass: 418K(512K)->418K(512K) Class: 28K(128K)->28K(128K)
[0.063s][info][gc ] GC(7) Pause Full (G1 Compaction Pause) 18M->18M(20M) 1.643ms
[0.063s][info][gc,cpu ] GC(7) User=0.02s Sys=0.00s Real=0.00s
[0.063s][info][gc,ergo ] Attempting maximum full compaction clearing soft references
[0.063s][info][gc,start ] GC(8) Pause Full (G1 Compaction Pause)
[0.063s][info][gc,task ] GC(8) Using 2 workers of 10 for full compaction
[0.063s][info][gc,phases,start] GC(8) Phase 1: Mark live objects
[0.064s][info][gc,phases ] GC(8) Phase 1: Mark live objects 0.638ms
[0.064s][info][gc,phases,start] GC(8) Phase 2: Prepare for compaction
[0.064s][info][gc,phases ] GC(8) Phase 2: Prepare for compaction 0.177ms
[0.064s][info][gc,phases,start] GC(8) Phase 3: Adjust pointers
[0.064s][info][gc,phases ] GC(8) Phase 3: Adjust pointers 0.337ms
[0.064s][info][gc,phases,start] GC(8) Phase 4: Compact heap
[0.064s][info][gc,phases ] GC(8) Phase 4: Compact heap 0.152ms
[0.064s][info][gc,heap ] GC(8) Eden regions: 0->0(1)
[0.064s][info][gc,heap ] GC(8) Survivor regions: 0->0(0)
[0.064s][info][gc,heap ] GC(8) Old regions: 1->1
[0.064s][info][gc,heap ] GC(8) Archive regions: 0->0
[0.064s][info][gc,heap ] GC(8) Humongous regions: 18->18
[0.064s][info][gc,metaspace ] GC(8) Metaspace: 447K(640K)->447K(640K) NonClass: 418K(512K)->418K(512K) Class: 28K(128K)->28K(128K)
[0.064s][info][gc ] GC(8) Pause Full (G1 Compaction Pause) 18M->18M(20M) 1.584ms
[0.064s][info][gc,cpu ] GC(8) User=0.00s Sys=0.00s Real=0.00s
[0.064s][info][gc,marking ] GC(3) Concurrent Mark Abort
java.lang.OutOfMemoryError: Java heap space
[0.064s][info][gc ] GC(3) Concurrent Mark Cycle 5.111ms
Dumping heap to ./oom-dump.hprof ...
Heap dump file created [12657044 bytes in 0.011 secs]
发生 OOM!共创建了 9 个对象。
[0.082s][info][gc,heap,exit ] Heap
[0.082s][info][gc,heap,exit ] garbage-first heap total 20480K, used 19566K [0x00000000fec00000, 0x0000000100000000)
[0.082s][info][gc,heap,exit ] region size 1024K, 1 young (1024K), 0 survivors (0K)
[0.082s][info][gc,heap,exit ] Metaspace used 670K, committed 832K, reserved 1114112K
[0.082s][info][gc,heap,exit ] class space used 48K, committed 128K, reserved 1048576K
java.lang.OutOfMemoryError: Java heap space
at org.dztyykxx.OOM.OOMDemo$OOMObject.<init>(OOMDemo.java:10)
at org.dztyykxx.OOM.OOMDemo.main(OOMDemo.java:20)
下面时导出的镜像

用MAT打开

然后会出现一个饼图

点击泄露报告

就对应这个第20行代码

Shallow Heap(浅堆): 对象本身占用的内存大小。例如,图中 java.util.ArrayList 的浅堆只有 24 字节,这仅仅是这个对象头和内部属性引用占用的基本空间,并不包含它里面存的数据。
Retained Heap(深堆): 这是排查内存泄漏的唯一关注点。它表示如果当前对象被垃圾回收器(GC)清理掉,能够连带释放出的总内存大小。

点开第一个
在当前的展开视图下,可以查看到堆快照生成瞬间,内存中存活的每一个具体的对象实例。

mat (Eclipse Memory Analyzer Tool)使用以及详解_eclipse memory analyzer 使用方法-CSDN博客