定位故障的思路
找出CPU占用率高的进程
找出问题进程内CPU占用率高的线程
通过线程栈信息找出该线程当时在运行的问题代码段
操作步骤
使用JDK自带的命令
1. 用top命令查找导致CPU占用率高的进程
2. 用top命令查找进程内导致CPU占用率高的线程 top -Hbp 进程号
例如 top -Hbp 15387
3.用JVM命令 jstack 精确定位出问题的代码段
3.1 用jstack 命令dump出线程栈信息,可以直接定位到出问题的代码段。这里也分两步。第一步把上面的线程ID 15531 转化为十六进制(因为jstack输出的线程栈信息中,线程ID是以十六进制展示的):
$ printf "%x\n" 15531
3cab
第二步使用命令 jstack $pid | grep “线程id” 把信息打印出来:
$ jstack 15387 | grep 3cab
也可以使用阿里开源的Arthas工具进行的
首先,下载Arthas命令
curl -L http://start.alibaba-inc.com/install.sh | sh
启动
./as.sh
使用Arthas命令"thread -n 3 -i 1000"查看当前"最忙"(耗CPU)的三个线程
通过上面的堆栈信息,可以看出,占用CPU资源的线程主要是卡在哪里