系统突然出现 CPU 飙高,你如何排查?
场景二如果系统突然出现 CPU 飙高你如何排查CPU 飙高是线上非常紧急的故障。排查思路需要分两步走先通过 Linux 命令定位是哪个进程、哪个线程出了问题再结合 JVM 工具分析具体的代码原因。第一步Linux 系统层面的快速定位确认负载情况使用top命令查看系统整体负载load average和 CPU 使用率。按P键让进程按 CPU 占用率降序排列迅速找到占用 CPU 最高的 Java 进程 PID。定位具体线程执行top -Hp PID查看该 Java 进程下所有线程的 CPU 占用情况找到占用 CPU 最高的线程 IDTID。转换线程 ID将找到的线程 ID十进制转换为十六进制命令为printf %x\n TID。因为后续 JVM 堆栈中显示的线程 ID 是十六进制的。第二步JVM 应用层面的深度分析导出线程堆栈使用jstack PID | grep 十六进制TID -A 20命令打印出该高负载线程的堆栈信息。分析堆栈信息核心业务代码死循环/复杂计算如果堆栈指向了你自己的业务代码如某个while循环、复杂的正则匹配、JSON 序列化等说明是代码逻辑导致了 CPU 飙升。频繁 Full GC如果堆栈中大量出现VM Thread或GC task thread且 CPU 飙高通常意味着系统内存不足JVM 在疯狂进行 Full GC即“GC 抖动”。此时需要配合jstat -gcutil PID 1000观察 GC 频率并使用jmap或 MAT 工具分析堆内存快照排查是否存在内存泄漏或大对象分配。锁竞争激烈如果堆栈显示大量线程处于BLOCKED状态或者都在等待同一把锁说明存在严重的锁竞争导致 CPU 消耗在上下文切换上。总结排查口诀top找进程 -top -Hp找线程 -printf转十六进制 -jstack抓堆栈 - 分析代码逻辑或 GC 状况。