一、先说流程
1、找到CPU利用率持续比较高的进程, 命令:
top
2、找到CPU使用率较高的线程ID(TID):
ps p 16480 -L -o pcpu,pid,tid,time,tname,cmd
此处为:16498
3、将获取的线程号(十进制数)转换成十六进制
printf "%x\n" 16498
结果:4072
4、结合进程号和线程号,利用jstack查到异常代码所在行
jstack -l <pid> | grep <thread-hex-id> -A 10
命令
显示出错的堆栈信息,如下图:
jstack -l 16480| grep 0x4072 -A 10
-A 10
参数用来指定显示行数,否则只会显示一行信息。
可以看到在代码的第13行有问题。也就是说是这一句导致cpu占用过高,在优化时,就可以针对这一部分代码进行优化。
二、相关知识点
JVM故障分析及性能优化系列文章
JVM故障分析及性能优化系列之一:使用jstack定位线程堆栈信息
JVM故障分析及性能优化系列之二:jstack生成的Thread Dump日志结构解析
JVM故障分析及性能优化系列之三:jstat命令的使用及VM Thread分析
JVM故障分析及性能优化系列之四:jstack生成的Thread Dump日志线程状态
JVM故障分析及性能优化系列之五:常见的Thread Dump日志案例分析
JVM故障分析及性能优化系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
JVM故障分析及性能优化系列之七:使用MAT的Histogram和Dominator Tree定位溢出源
还有一篇