- CPU 飙高 5 步排查手册
| 步骤 | 命令/工具 | 关键输出 |
|---|---|---|
| ① 定位进程 | top -H / htop | 找出 %CPU 最高的 PID/TID |
| ② 转储线程 | jstack <PID> > cpu.log | 查看线程状态、锁、死循环 |
| ③ 热点方法 | arthas profiler start --duration 60 或 async-profiler | 火焰图直接显示最热的栈 |
| ④ 内存泄漏 | jmap -histo:live <PID> | 看是否对象暴涨导致频繁 GC |
| ⑤ 根因修复 | 见下表 | — |
常见根因 & 修复
| 根因 | 现象 | 修复 |
|---|---|---|
| 死循环 | 火焰图集中在 1 个方法 | 修正业务逻辑 |
| 频繁 Young GC | Eden 区 10 秒一次 | 增大 -Xms/-Xmx 或调比例 |
| 大量反射 | Class.forName 占 30%+ CPU | 缓存 Method/Field |
| 日志级别误开 DEBUG | Log4j2 AsyncAppender 打满 | 改回 INFO 并加采样 |
- 面试一句话模板
“Redis 集群选型:小系统主从,高可用哨兵,海量 Cluster;
死锁用 jstack 搜 deadlock;
CPU 飙高先 top -H 找线程 → jstack 看栈 → async-profiler 火焰图 → 代码或 JVM 参数修复。”