若us持续近100%、id长期低于5%且wa很低,高度提示业务代码死循环;需依序用top定位进程、top -H锁定线程、jstack或gdb查栈、对比快照确认循环。

直接看 top 头部的 %Cpu(s) 行,如果 us(用户态)持续接近 100% 且 id(空闲)长期低于 5%,同时 wa(IO 等待)很低,就高度提示是业务代码死循环——而不是磁盘或内核问题。
第一步:用 top 定位高 CPU 进程
- 运行
top,按大写P确保按%CPU降序排列 - 找出
%CPU持续 >80%(单核场景)且长时间不回落的进程 - 记下它的 PID(第一列),并观察
COMMAND是否为 Java、Python、Node 或自研服务名
第二步:用 top -H 锁定具体线程
- 执行
top -H -p,只查看该进程下的所有线程(LWP) - 再次按
P排序,关注%CPU最高的几个 TID(线程 ID) - 注意:TID 是十进制数,和 PID 同属一个命名空间;同一进程内多个 TID 可能共享高负载
第三步:把 TID 映射到业务线程名和调用栈
- 对 Java 应用:
- 将 TID 转为十六进制:
printf "%x\n" - 执行
jstack,找到对应线程名和堆栈| grep -A 20
- 将 TID 转为十六进制:
- 对 C/C++/Go 程序:
- 查线程名:
cat /proc//task/ /comm - 查完整调用栈:
gdb -p-ex "thread apply all bt" -ex quit 2>/dev/null | grep -A 5 -B 5
- 查线程名:
第四步:确认是否真为死循环
- 看栈顶帧是否反复出现在同一业务方法(如
com.example.Service.processLoop()) - 检查线程状态是否长期为
R(Running):ps -T -o pid,tid,state,comm -p - 对比两次
jstack快照(间隔 3–5 秒):若栈顶行号完全不变、无sleep/wait/park调用,基本可判定
不复杂但容易忽略。











