jvm 内存泄漏排查( 二 )


命令: jmap -dump:format=b,file={path} {pid}

jvm 内存泄漏排查

文章插图
dump 文件路径: D:\heapdump_108244.hprof
3、利用 MAT 分析 dump 文件
MAT:Memory Analyzer Tool,是针对 java 的内存分析工具;下载地址:
jvm 内存泄漏排查

文章插图
选择对应的版本,下载后直接解压;默认情况下,mat 最大内存是 1024m,而我们的 dump 文件往往大于 1024m,所以我们需要调整,在 mat 的 home 目录下找到 MemoryAnalyzer.ini,将 -Xmx1024m 修改成大于 dump 大小的空间,我把它改成了 -Xmx4096m
接着我们就可以将 dump 文件导入 mat 中,开始 dump 文件的解析
jvm 内存泄漏排查

文章插图
解析是个比较漫长的过程,我们需要耐心等待
jvm 内存泄漏排查

文章插图
解析完成后,我们可以看到如下概况界面
jvm 内存泄漏排查

文章插图
各个窗口的各个细节就不做详细介绍了,有兴趣的可自行去查阅资料;我们来看看几个图:饼状图、直方图、支配树、可疑的内存泄露报告
饼状图
jvm 内存泄漏排查

文章插图
可以看出,com.lee.schedule.Schedule 对象持有 1G 内存,肯定有问题
直方图
jvm 内存泄漏排查

文章插图
我们看下 Person 定义
jvm 内存泄漏排查

文章插图
可想而知,上图标记的几项都与 Person 有关
支配树
jvm 内存泄漏排查

文章插图
这就非常直观了,Schedule 中的 ArrayList 占了 99.04% 的大小
可疑的内存泄露报告
jvm 内存泄漏排查

文章插图
通过这些数据,相信大家也能找到问题所在了
jvm 内存泄漏排查

文章插图
Linux
排查方式与 Windows 一样,只是有稍许的命令区别
1、找到内存占有率最高的进程号
使用命令: top -c 显示运行中的进程列表信息,shift + m 按内存使用率进行排序
jvm 内存泄漏排查

文章插图
进程号: 2527
2、利用 jmap 生成堆转储快照
命令: jmap -dump:format=b,file={path} {pid}
jvm 内存泄漏排查

文章插图
堆转储快照文件路径: /opt/heapdump_2527.hprof
3、利用 MAT 分析堆转储快照
将 heapdump_2448.phrof 下载到本地,利用 MAT 进行分析;分析过程与 Windows 版完全一致
jvm 内存泄漏排查

文章插图
自此,定位到问题
Windows下 与 Linux 下,排查流程是一样的
jvm 内存泄漏排查

文章插图
总结
JVM 常用命令
jps:列出正在运行的虚拟机进程
jstat:监视虚拟机各种运行状态信息,可以显示虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
jinfo:实时查看和调整虚拟机各项参数
jmap:生成堆转储快照,也可以查询 finalize 执行队列、Java 堆和永久代的详细信息
jstack:生成虚拟机当前时刻的线程快照
jhat:虚拟机堆转储快照分析工具
与 jmap 搭配使用,分析 jmap 生成的堆转储快照,与 MAT 的作用类似

推荐阅读