JVM 之 Linux定位CPU过高问题并优化

项目部署以后出行卡顿现象,所以对问题进行了排查,记录一下排查过程

1.找进程
top
JVM 之 Linux定位CPU过高问题并优化
可以发现,是Java进程导致的CPU过高,致使系统卡顿

2.找线程
ps -mp pid -o THREAD,tid,time
JVM 之 Linux定位CPU过高问题并优化
发现占比最大的线程

3.线程id转换16进制
printf “%x\n” pid
JVM 之 Linux定位CPU过高问题并优化
得到6a33,方便下一步排查

4.查询代码位置
jstack pid|grep tid -A 30
JVM 之 Linux定位CPU过高问题并优化
发现全是GC线程

5.查看gc频率
jstat -gcutil pid 时间间隔 打印次数
JVM 之 Linux定位CPU过高问题并优化
发现Eden很满,不断增长,GC次数过多

6.dump堆文件
jstack pid >>jstack.out
JVM 之 Linux定位CPU过高问题并优化
7.查找dump文件
find . -name “jstack.out”
这步可有可无,生成在当前目录
JVM 之 Linux定位CPU过高问题并优化
JVM 之 Linux定位CPU过高问题并优化
8.IBM Thread and Monitor Dump Analyzer for Java
可视化工具分析dump文件

JVM 之 Linux定位CPU过高问题并优化
查看结果还算正常

9.尝试调整JVM参数
查看JVM参数,发现默认才512m

查看系统总内存
cat /proc/meminfo查看linux系统内存大小的详细信息
JVM 之 Linux定位CPU过高问题并优化
发现总内存约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次。