在服务器排查java某个线程导致CPU飙高教程
🧩 第一步:确定是哪个线程占用 CPU 高
1.1 使用 top
或 htop
命令查看高 CPU 的 Java 进程
top -Hp <Java进程PID>
-H
表示显示线程级别;-p
后面跟 Java 主进程的 PID;- 你会看到各个线程的 CPU 使用情况,找出使用率高的线程。
1.2 记录高 CPU 的线程 ID(LWP)
假设你看到某个线程的 PID 是 12345
,这其实是 线程的 LWP(Light Weight Process ID)。
你需要将这个十进制的 LWP 转换成十六进制(用于下一步匹配线程):
printf "%x\n" 12345
输出可能是:3039
(注意不带0x
)
🔍 第二步:用 jstack 找出对应线程的 Java 栈信息
jstack <Java进程PID> > jstack.log
然后在输出的 jstack.log
中搜索刚才的十六进制线程 ID(注意是小写):
grep -A 30 "nid=0x3039" jstack.log
这段输出中就是该线程的 Java 调用栈,可以看到是哪个类、哪个方法在运行。
✅ 示例流程总结
-
查看 Java 进程 PID(假设是 2222):
ps -ef | grep java
-
查看线程占用:
top -Hp 2222
-
找到线程号(如 12345),转换为 hex:
printf "%x\n" 12345 # 输出 3039
-
导出线程栈并搜索对应线程:
jstack 2222 > jstack.log grep -A 30 "nid=0x3039" jstack.log
🧠 补充建议
-
使用
jstack
多次采样,可以观察线程是否卡在某处不动; -
对生产环境建议使用
jcmd
(更安全):jcmd <Java进程PID> Thread.print > jstack.log
-
如果你使用的是容器环境,请注意容器内可能需要安装
procps
、openjdk
的bin
工具。