shell脚本排查java进程cpu消耗过高问题

关于JVM性能调优监控,网上可以找到很多排查Java进程cpu消耗过高的方法,不过几乎都是告诉你如何依次输入命令排查,为了方便排查问题的时候不用依次输入众多命令,我们可以将排查命令写入脚本。

  • 新建 monitor.sh,输入以下脚本:
#!/bin/bash
#找出java的进程ID
javaId=`pgrep java`
#找出java进程中最消耗cpu的线程ID
topJavaId=`top -b -n 1 -Hp ${javaId}|grep java|head -n 1|awk '{print $1}'`
#将最耗cpu的java线程ID转换为16进制
topJavaId16=`printf "%x" ${topJavaId}`
#定位最耗cpu的线程位置
jstack ${javaId}|grep ${topJavaId16}

当出现java进程消耗cpu过高的时候,在终端下输入 bash monitor.sh 运行以上脚本,便可输出java进程最耗cpu的线程堆栈信息。

注意:上诉脚本如果是在 windows 下编写并传到 linux 服务器运行的时候,会出现非法字符问题,windows下的回车换行符和 linux下的回车换行符有一定区别,所以最好在 linux 环境下编辑脚本并运行。

扩展:以上脚本只是出现问题的时候,手动运行,这时可能cpu已经卡死,导致脚本运行卡顿或者迟迟没有输出结果,所以,更好的做法是,循环定时运行脚本,判断当cpu消耗大于一定比例的时候,自动输出线程堆栈结果,并将定位结果输出到文件中保存。