堆转储是线上排查最重的一刀。这篇用同样的堆状态,把 jmap 的直方图和转储在「含不含垃圾」「触不触发 GC」「文件多大」「应用停多久」几方面逐项量出来,并对照 jcmd。
[jmap -histo] 耗时 0.22 s;Total 6645923 个对象 / 387 MB;GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=0
2: 3000000 96000000 Main$Garbage
3: 300000 9600000 Main$Live
1: 3310668 290290680 [B (java.base@21.0.12.1)
[jmap -histo:live] 耗时 0.09 s;Total 631197 个对象 / 127 MB;GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=1
235: 1 32 Main$Garbage
2: 300000 9600000 Main$Live
1: 308296 122032696 [B (java.base@21.0.12.1)[-dump:format=b] 耗时 0.43 s;文件 454.1 MB;文件头 “JAVA PROFILE 1.0.2”;jmap 输出:Heap dump file created [476119052 bytes in 0.262 secs];GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=0;GAP 263 [-dump:live,format=b] 耗时 0.21 s;文件 137.2 MB;文件头 “JAVA PROFILE 1.0.2”;jmap 输出:Heap dump file created [143817948 bytes in 0.043 secs];GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=1;GAP 43 live / all 文件大小比:0.30 对照(什么都不做 1.5 秒):最大间隔 GAP 7 jmap -histo(含不可达)期间:最大间隔 GAP 39(耗时 0.26 s)
jmap 的工作目录是 sub/,目标 JVM 的工作目录是 j205a/;file=rel.hprof → Heap dump file created [475230224 bytes in 0.243 secs]
rel.hprof 出现在目标 JVM 的目录: False ;出现在 jmap 的目录: True
再转储到同一个文件名:
Dumping heap to <dir>/sub/rel.hprof ...
Unable to create <dir>/sub/rel.hprof: File exists jmap -clstats:8 行;前 3 行:
ClassLoader Parent CLD* Classes ChunkSz BlockSz Type
0x0000008800069008 0x0000000000000000 0x000000783cfa0780 0 0 0 jdk.internal.loader.ClassLoaders$PlatformC
0x0000000000000000 0x0000000000000000 0x000000783cfa0140 696 4456448 452240 <boot class loader>
jmap -heap:
Error: -heap option used
Cannot connect to core dump or remote debug server. Use jhsdb jmap instead
jmap -finalizerinfo:
No instances waiting for finalization found
jmap -histo:foo(不存在的子选项):
Fail: invalid option: 'foo'
Usage:
jmap -clstats <pid>jmap -dump:format=b 耗时 0.47 s;文件 454.1 MB;GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=0 jmap -dump:live,format=b 耗时 0.24 s;文件 137.2 MB;GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=1 jcmd GC.heap_dump 耗时 0.24 s;文件 137.2 MB;GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=1 jcmd GC.heap_dump -all 耗时 0.49 s;文件 454.1 MB;GC 计数 GC Young=0 Conc=0 Old=0 → GC Young=0 Conc=0 Old=0