Administrator
Administrator
发布于 2026-03-15 / 3 阅读
0
0

JVM OOM故障排查演示

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();
        }
    }
}

image-20260311173554757.png

带上虚拟机参数在运行

  • -Xms20m 堆内存最小20mb
  • -Xmx20m 堆内存最大20mb
  • -XX:+HeapDumpOnOutOfMemoryError OOM是导出堆内存快照
  • -XX:HeapDumpPath=./oom-dump.hprof 快照文件的导出路径
  • -Xlog:gc* 打印GC日志

image-20260311174335804

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)

下面时导出的镜像

image-20260311174432254

用MAT打开

image-20260311175025275

然后会出现一个饼图

image-20260311175841498

点击泄露报告

image-20260311175244704

就对应这个第20行代码

image-20260311175322059

Shallow Heap(浅堆): 对象本身占用的内存大小。例如,图中 java.util.ArrayList 的浅堆只有 24 字节,这仅仅是这个对象头和内部属性引用占用的基本空间,并不包含它里面存的数据。

Retained Heap(深堆): 这是排查内存泄漏的唯一关注点。它表示如果当前对象被垃圾回收器(GC)清理掉,能够连带释放出的总内存大小。

image-20260311180206135

点开第一个

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

image-20260311180307229

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


评论