0x01 top查看cpu占用率
# 执行top查看进程的cpu占用情况
top
top命令查看cpu占用情况
从截图可以看出,这个Java应用占用的cpu为16.3%,PID为9,这里的占用率并不算高,假设这里占用率特别高,我们应该怎么排查呢?
0x02 查看Java应用线程的cpu占用率
# 执行top -Hp查看PID为9的进程中线程的cpu占用情况
top -Hp 9
Java应用线程占用cpu情况
从上图中可以看出,线程id为321的线程的cpu占用率为3.3%
0x03 分析对应线程的调用栈
# 将第2步中获取到的线程id 321转换为16进制
printf "%x" 321
# 输出结果为 141
# 使用jstack查看线程id为0x141的调用栈
jstack 9 |grep nid=0x141 |grep -A 10
jstack查看线程的调用栈
从图中可以看到该线程的调用栈,由于我是随便找的一个cpu使用率并不高的线程,所以从这个调用栈看不出明显的信息。如果是真实的cpu升高的场景(并且是由于业务代码导致的),通过这个方法是能定位到具体哪个类哪一行存在问题。