JVM 之 Linux定位CPU过高问题并优化
项目部署以后出行卡顿现象,所以对问题进行了排查,记录一下排查过程
1.找进程
top
可以发现,是Java进程导致的CPU过高,致使系统卡顿
2.找线程
ps -mp pid -o THREAD,tid,time
发现占比最大的线程
3.线程id转换16进制
printf “%x\n” pid
得到6a33,方便下一步排查
4.查询代码位置
jstack pid|grep tid -A 30
发现全是GC线程
5.查看gc频率
jstat -gcutil pid 时间间隔 打印次数
发现Eden很满,不断增长,GC次数过多
6.dump堆文件
jstack pid >>jstack.out
7.查找dump文件
find . -name “jstack.out”
这步可有可无,生成在当前目录
8.IBM Thread and Monitor Dump Analyzer for Java
可视化工具分析dump文件
查看结果还算正常
9.尝试调整JVM参数
查看JVM参数,发现默认才512m
查看系统总内存
cat /proc/meminfo查看linux系统内存大小的详细信息
发现总内存约64G
将-Xmx 最大堆内存设置为1024m,扩大一倍看看
重启服务发现GC频率明显下降,恢复正常,满足以下标准
如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化;如果GC时间超过1〜3 秒,或者频繁G C
,则必须优化。如果满足下面的指标,则一般不需要进行GC: ■ Minor GC执行时间不到50ms; ■ Minor
GC执行不频繁,约10秒一次; ■ Full GC执行时间不到1s; ■ Full GC执行频率不算频繁,不低于10分钟1次。