-
top 找到CPU占用最高的pid
-
top -Hp ${pid} 找到CPU占用最高的线程id记录一下
-
jstack -l ${pid} > 工程名_jstack.txt 导出线程详情
-
分析(开发参与)根据线程id(转换为16进制),可以从工程名_jstack.txt定位到 具体代码行
-
将工程名_jstack.txt用可视化在线分析工具来分析 : https://heaphero.io/index.jsp
以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。
根据top命令,发现pid为28555的Java进程占用CPU高达200%,出现故障。
通过ps aux | grep ${pid} 命令,可以进一步确定是tomcat进程出现了问题。但是,怎么定位到具体线程或者代码呢?
首先显示线程列表:
ps -mp ${pid} -o THREAD,tid,time
找到了耗时最高的线程28802,占用CPU时间快两个小时了!
其次将需要的线程ID(tid)转换为16进制格式:
printf "%x\n" ${tid}
最后打印线程的堆栈信息:
jstack -l ${pid} > jstack.txt
grep "xxx" -A 30 jstack.txt
注:xxx为16进制格式的tid
基本上,就找到出现问题的代码了!
参考
top -Hp pid 显示所有的线程
https://www.cnblogs.com/muahao/p/6266859.html
结合top和jstack找出占用cpu最高的堆栈信息
https://blog.csdn.net/u013593306/article/details/52468651
线上应用故障排查系列
http://www.blogjava.net/hankchen/archive/2012/05/09/377738.html
网友评论