线上CPU飙高排查

发布时间:2026/6/1 7:33:02

线上CPU飙高排查 线上CPU飙高原因排查流程面试标准回答Java后端通用直接背一、常见CPU飙高原因分大类面试必答1. 代码层面最常见死循环/循环逻辑异常while(true)、递归无终止条件、遍历逻辑死循环频繁GCFull GC/YGC频繁内存泄漏、对象创建过多、大对象、内存溢出密集计算大数据量循环、复杂正则、加密/解析、序列化、数学运算锁竞争激烈自旋锁、synchronized/ReentrantLock 大量等待线程空转线程池滥用线程无限创建、任务堆积、线程死循环执行任务IO阻塞假象少量IO阻塞大量重试/轮询导致CPU空跑2. 框架/中间件层面定时任务扎堆执行、任务并发过高连接池耗尽线程反复重试获取连接第三方SDK/中间件Bug、轮询心跳异常日志狂打错误日志刷屏、异步日志阻塞3. 系统/运维层面服务器被其他进程抢占CPU病毒、挖矿程序、恶意脚本内核/驱动、虚拟化环境异常二、标准排查流程线上实操步骤面试按顺序说步骤1服务器全局定位Linuxtop查看整机CPU、负载找到CPU占比最高的进程PIDshift P按CPU排序记录高CPU PID步骤2定位进程内高消耗线程top -Hp 进程PID查看该进程下所有线程按CPU排序记录线程TID十进制printf %x\n 十进制TID转成十六进制jstack用步骤3抓取线程栈定位代码行jstack 进程PID | grep 十六进制TID -A 20查看线程栈卡在循环/业务代码 → 代码死循环/密集计算卡在锁/park→ 锁竞争、死锁大量线程处于RUNNABLE且在GC相关方法 → GC问题步骤4如果是GC导致CPU高高频场景jstat -gc 进程PID 1000每秒看GC次数、耗时jmap -dump:formatb,filexxx.hprof 进程PID导出堆快照用MAT/VisualVM分析内存泄漏、大对象、重复创建对象步骤5辅助验证查看监控面板接口QPS、耗时、报错量、定时任务、慢日志查看系统日志报错刷屏、死循环日志、异常重试临时处理重启、限流、关停异常定时任务、切流量止损三、面试满分回答分「简答版」「详细版」按需选用 简答版一面/快速提问1分钟说完线上CPU飙高主要分为代码逻辑、GC、锁竞争、中间件/运维四类。排查先通过top找到高CPU进程再用top -Hp定位高消耗线程转十六进制后用jstack查看线程栈定位代码如果是GC频繁导致就用jstat观察GC情况jmap导出堆文件用MAT分析内存问题同时结合监控、日志、定时任务综合排查先止损再修复代码。 详细版二面/架构岗完整流程2–3分钟我梳理下线上CPU飙高的原因和完整排查思路常见原因第一类是业务代码问题死循环、递归无退出、密集计算、频繁创建对象第二类是GC异常内存泄漏、频繁Full GC/YGCGC线程占用大量CPU第三类是并发问题锁竞争、线程池不合理、线程空转还有定时任务扎堆、日志刷屏、第三方组件或服务器进程抢占资源也会导致。排查流程线上标准流程① 先用top命令查看整机状态定位CPU占用最高的Java进程PID② 执行top -Hp PID查看进程内线程找到CPU最高的线程ID转为十六进制③ 使用jstack PID结合十六进制线程ID打印线程堆栈直接定位到具体代码行栈卡在业务循环处判断死循环/密集计算大量线程阻塞在锁相关代码锁竞争或死锁线程卡在GC模块判定GC导致CPU高。④ 若为GC问题用jstat持续观测GC频率与耗时jmap导出堆快照通过MAT分析内存泄漏、大对象、无效对象。⑤ 最后结合应用监控、接口日志、定时任务、中间件状态交叉验证线上优先限流、重启、关停异常任务止损再修复代码。优化方向修复死循环、简化密集计算、优化对象创建避免内存泄漏、合理配置线程池与锁、错峰执行定时任务。四、高频追问应答问怎么区分是代码死循环还是GC导致CPU高答jstack看线程栈业务线程卡在业务代码就是死循环/计算大量线程栈在GC相关方法、且jstat看到GC频繁就是GC问题。问线上能频繁jmap dump吗答不建议dump会暂停应用STW线上优先先抓jstack低峰期再dump或使用在线分析工具。问遇到CPU100%紧急处理步骤答先止损限流、摘除节点、重启实例再保留现场抓jstack、日志最后排查根因修复。

相关新闻