JVM dump文件 内存分析
一.生成dump文件步骤
1.程序启动时指定内存大小
nohup java -Xms2048m -Xmx3096m -jar app.jar > app.log &
2.假如生产环境上应用内存占用很高那么我们如何排查
[root@fk calc] top
top - 15:50:21 up 81 days, 7:03, 1 user, load average: 0.38, 0.73, 0.86
Tasks: 688 total, 1 running, 687 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.8 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 52808089+total, 27655750+free, 12646478+used, 12505859+buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 39595475+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28325 tydic 20 0 43.9g 22.0g 17096 S 29.4 4.4 34654:18 java
21843 root 20 0 162772 2828 1544 R 11.8 0.0 0:00.04 top
22972 tydic 20 0 44.9g 1.6g 15972 S 11.8 0.3 696:23.84 java
37562 hdfs 20 0 4364440 679644 24676 S 11.8 0.1 1655:34 java
26600 tydic 20 0 35.5g 1.4g 15232 S 5.9 0.3 17:53.19 java
31562 root 20 0 37.7g 1.4g 14268 S 5.9 0.3 131:02.85 java
36936 hdfs 20 0 3300036 564708 24780 S 5.9 0.1 107:50.54 jsvc
44814 tydic 20 0 44.9g 1.5g 15948 S 5.9 0.3 558:34.27 java
46600 tydic 20 0 40.2g 9.2g 399580 S 5.9 1.8 5021:36 java
3.生成Java进程dump文件
jmap -dump:format=b,file=a.hprof 7962
二.分析dump文件
1. 通过eclipse mat 工具打开dump
2. 查看内存占用最高的类选择(Dominator Tree)
3.查看与业务代码相关的包 通过regex 表达式过滤 得到内存占用最大的大对象
注意 其实一般Java程序启动都设置了最大内存最小内存, 且oom 导出dump镜像
java
-Xms2048m
-Xmx3096m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=dumpfile.hprof
-jar app.jar