jvm导出dump日志,分析内存情况
1. 查看内存情况 top
free
top
pid=18426 占用内存比例很高
2. 导出dump日志
jmap -dump:format=b,file=heap.hprof 18426
当前目录:
3. 下载到本地,使用MAT打开进行分析
设置MAT内存大小:
几种图表现形式:
内存泄露检测:
这里一个名称叫做 king-thread 的线程,持有了超过 99% 的对象,数据被一个 HashMap 所持有。
这个就是内存泄漏的点,因为我代码中对线程进行了标识,所以像阿里等公司的编码规范中为什么一定要给线程取名字,这个是有依据的,如果不取名
字的话,这种问题的排查将非常困难。
4. jmap Java内存映像工具
[root@iZuf6aveva4meli5nqltfnZ ty]# jmap -heap 18426
Attaching to process ID 18426, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2065694720 (1970.0MB)
NewSize = 42991616 (41.0MB)
MaxNewSize = 688390144 (656.5MB)
OldSize = 87031808 (83.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 95420416 (91.0MB)
used = 31189512 (29.74463653564453MB)
free = 64230904 (61.25536346435547MB)
32.68641377543355% used
From Space:
capacity = 226492416 (216.0MB)
used = 0 (0.0MB)
free = 226492416 (216.0MB)
0.0% used
To Space:
capacity = 229113856 (218.5MB)
used = 0 (0.0MB)
free = 229113856 (218.5MB)
0.0% used
PS Old Generation
capacity = 1045954560 (997.5MB)
used = 855781112 (816.1364669799805MB)
free = 190173448 (181.36353302001953MB)
81.81819217844416% used
12211 interned Strings occupying 1177184 bytes.
-histo 打印每个 class 的实例数目,内存占用,类全名信息.
如果 live 子参数加上后,只统计活的对象数量.
[root@iZuf6aveva4meli5nqltfnZ ty]# jmap -histo:live 18426 | head -20
num #instances #bytes class name
----------------------------------------------
1: 5702941 237256960 [C
2: 5702926 136870224 java.lang.String
3: 2569524 102780960 java.util.LinkedHashMap$Entry
4: 965117 90681016 [B
5: 1212225 77546376 [Ljava.util.HashMap$Node;
6: 1212288 67888128 java.util.LinkedHashMap
7: 961798 38471920 zipkin2.Endpoint
8: 499998 35999856 zipkin2.Span
9: 708724 28348960 java.util.TreeMap$Entry
10: 498009 11952216 zipkin2.storage.InMemoryStorage$TraceIdTimestamp
11: 709505 11352080 java.util.LinkedHashSet
12: 501183 8018928 java.util.LinkedHashMap$LinkedEntrySet
13: 9126 1599128 [Ljava.lang.Object;
14: 9576 1063048 java.lang.Class
15: 25867 827744 java.util.concurrent.ConcurrentHashMap$Node
16: 3758 627096 [I
17: 546 358176 io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueue
-dump 生成的堆转储快照
jmap -dump:live,format=b,file=heap.bin <pid>
5. jstat 监视虚拟机各种运行状态信息的命令行工具
常用参数:
-class (类加载器)
-compiler (JIT)
-gc (GC 堆状态)
-gccapacity (各区大小)
-gccause (最近一次 GC 统计和原因)
-gcnew (新区统计)
-gcnewcapacity (新区大小)
-gcold (老区统计)
-gcoldcapacity (老区大小)
-gcpermcapacity (永久区大小)
-gcutil (GC 统计汇总)
-printcompilation (HotSpot 编译统计)
每 250 毫秒查询一次进程 13616 垃圾收集状况,一共查询 10 次,那命令应当是:jstat-gc 13616 250 10
[root@iZuf6aveva4meli5nqltfnZ ty]# jstat -gc 18426
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
[root@iZuf6aveva4meli5nqltfnZ ty]# jstat -gc 18426 250 10
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
223744.0 5632.0 0.0 0.0 91648.0 13095.4 1014784.0 835755.2 50392.0 47707.2 6656.0 6024.3 55 8.670 9 10.776 19.446
S0C:第一个幸存区(From 区)的大小
S1C:第二个幸存区(To 区)的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园(Eden)区的大小
EU:伊甸园(Eden)区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
6. 生产服务器推荐开启
-XX:-HeapDumpOnOutOfMemoryError 默认关闭,建议开启,在 java.lang.OutOfMemoryError 异常出现时,输出一个 dump 文件,记录当时的堆内存快照。
-XX:HeapDumpPath=./java_pid.hprof 用来设置堆内存快照的存储文件路径,默认是 java 进程启动位置。
java -jar -Xms1500m -Xmx1500m -Xmn1000m -XX:SurvivorRatio=8 jvm-1.0-SNAPSHOT.jar