背景
有时候部署在 Linux 上的 Java 程序占用的 CPU 会突然飙高,然后会持续一段时间。此时就需要找到是什么原因导致的 CPU 高,然后解决它。大致过程是:找出占用 CPU 较高的线程PID --〉输出 Java 程序线程堆栈信息 --〉转换占用 CPU 高线程 PID 为 16 进制,在堆栈信息中找到相应的线程堆栈 --〉优化对应的线程。
详细步骤
1、查找占用 CPU 高的线程
先用 top 命令找出占用 CPU 百分比较高的 Java 进程 PID,然后再使用下面命令输出该进程下所有线程CPU、内存等信息。
top -H -p PID
从输出的信息中找到占 CPU 较高的线程 PID,然后转换为 16 进制,例如:256 --> 0x100
2、输出 Java 程序线程堆栈信息
使用 jstack 命令输出线程堆栈信息到一个文件中。
jstack -l PID(进程PID) > app.stack
3、找到对于的线程栈信息
在 app.stack 文件中搜索 nid=0x100 的线程,这个线程的状态是 RUNNAble,一般情况下是我们自己写的业务代码程序。
4、优化代码程序
知道了那段代码引起的 CPU 飙高,根据具体情况作出相应调整。