一.问题
生产环境服务器变慢
二.分析
从以下5个角度进行排查
1.CPU —— top命令
2.内存 —— free命令
3.硬盘 —— df命令
4.磁盘Io —— iostat命令
5.网络Io —— ifstat命令
三.步骤
1.Top命令进行整机查看
从图中看出cpu基本正常,平均加载时间也正常,内存8.8g!!!
2.初步定位内存太高,可能原因,内存溢出
3.细看内存,执行命令free
发现free内存很少
4.查看gc回收器,执行命令 jmap -heap pid(进程号)
fullgc不回收
5.查看堆内存部分使用量 执行jstat -gcutil pid 1000
6.已初步确定内存溢出
7.导出内存快照 jmap -dump:format=b,file=/tmp/heap.hprof pid
8.下载到本地用MAT工具查看
懒汉式排查,直接查看Leak Suspects快速查看泄露的可疑点
可以看出Hashmap中存在一个6g的数据一直占用内存,而且no GC root(可达性分析) 即不会被老年代的Full Gc回收。
9.排查最近的代码,是否有新增Job或者Mq,里面是否有用到Hashmap
10.最终发现有个job里面有用到Hashmap去获取一个非单例的对象。
11.第二种工具jvisualvm
将内存快照导入jvisualvm
选择最高的大对象点击进去查看
四.总结
针对不同的情况要从不同角度去分析
先整体排查定位问题,针对不同问题排查不同地方
一些常用排查命令请参考:https://www.cnblogs.com/shawn-sun/p/13970396.html