JVM常见线上问题 → CPU 100%、内存泄露 问题排查( 二 )


接着我们就可以将 dump 文件导入 mat 中,开始 dump 文件的解析

JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
解析是个比较漫长的过程,我们需要耐心等待
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
解析完成后,我们可以看到如下概况界面
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

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

文章插图
 
可以看出, com.lee.schedule.Schedule 对象持有 1G 内存,肯定有问题
直方图
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
我们看下 Person 定义
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
可想而知,上图标记的几项都与 Person 有关
支配树
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
这就非常直观了,Schedule 中的 ArrayList 占了 99.04% 的大小
可疑的内存泄露报告
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
通过这些数据,相信大家也能找到问题所在了
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

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

文章插图
 
进程号: 2527
2、利用 jmap 生成堆转储快照
命令: jmap -dump:format=b,file={path} {pid}
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
堆转储快照文件路径: /opt/heapdump_2527.hprof
3、利用 MAT 分析堆转储快照
将 heapdump_2448.phrof 下载到本地,利用 MAT 进行分析;分析过程与 Windows 版完全一致
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
自此,定位到问题
Windows下 与 Linux 下,排查流程是一样的
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
总结JVM 常用命令jps:列出正在运行的虚拟机进程
jstat:监视虚拟机各种运行状态信息,可以显示虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
jinfo:实时查看和调整虚拟机各项参数
jmap:生成堆转储快照,也可以查询 finalize 执行队列、Java 堆和永久代的详细信息
jstack:生成虚拟机当前时刻的线程快照
jhat:虚拟机堆转储快照分析工具
与 jmap 搭配使用,分析 jmap 生成的堆转储快照,与 MAT 的作用类似
排查步骤1、先找到对应的进程: PID
2、生成线程快照 stack (或堆转储快照: hprof )
3、分析快照(或堆转储快照),定位问题
内存泄露、内存溢出和 CPU 100% 关系 
JVM常见线上问题 → CPU 100%、内存泄露 问题排查

文章插图
 
常用 JVM 性能检测工具Eclipse Memory Analyer、JProfile、JProbe Profiler、JVisualVM、JConsole、Plumbr




推荐阅读