怎么排查线上CPU100%的问题

方案一:仅使用 JDK 原生工具(零依赖,无需额外安装)

JDK 自带工具无需额外下载,是 Linux 下排查 Java CPU 高的基础方案,核心流程为「定位进程→定位线程→定位代码→排查根因」。

步骤 1:定位高 CPU 的 Java 进程

操作 命令 关键说明
查看系统高 CPU 进程 top 按P键按 CPU 占用率从高到低排序,找到%CPU≈100% 的进程,记下进程 PID
验证是否为 Java 进程 jps -l 列出所有 Java 进程(PID + 主类 /jar 包路径),确认第一步的 PID 对应你的应用

步骤 2:定位进程内高 CPU 的线程

Java 进程 CPU 高通常是单个 / 少数线程导致,需进一步缩小范围:

操作 命令 关键说明
查看进程内线程 CPU 占用 top -Hp [进程PID] 按P排序,找到 CPU 占比最高的线程,记下线程 tid(LWP 列数值)
线程 ID 转为 16 进制 printf "%x\n" [线程tid] jstack 日志中线程 ID 为 16 进制,示例:printf "%x\n" 12345 → 输出3039(小写即可)

步骤 3:抓取线程栈,定位具体代码行

线程栈(thread dump)是定位问题代码的核心:

复制代码
# 导出线程栈到日志文件(方便查看)
jstack [进程PID] > thread_dump.log

# 打开日志并搜索16进制线程ID
vim thread_dump.log
# 在vim中输入 /[16进制tid] 搜索(比如 /3039)
  • 重点看搜索结果中RUNNABLE状态的线程(表示线程正在运行);
  • 堆栈信息会明确显示:类名.方法名(文件名:行号)(如com.xxx.service.UserService.queryUser(UserService.java:58)),这就是 CPU 高的核心代码位置。

步骤 4:辅助排查 ------ 验证是否为频繁 GC 导致

若代码无明显异常,需排查 GC 问题:

复制代码
# 每秒输出一次GC统计,持续监控
jstat -gc [进程PID] 1000
  • 关注FGC(Full GC)列:若每秒多次 Full GC,大概率是内存泄漏导致 GC 频繁占用 CPU;
  • 关注YGCT/FGCT列:GC 总耗时过高也会拉高 CPU。

步骤 5:常见根因及解决方法

根因 典型特征 解决方法
死循环 / 无限循环 线程状态一直RUNNABLE,对应代码有while(true)无退出条件 修复循环退出条件,增加超时 / 中断判断
频繁 Full GC(内存泄漏) jstat看 FGC 频繁,Arthas dashboard 看 GC 耗时高 排查内存泄漏(如静态集合无限添加、未关闭连接),调整 JVM 内存参数
锁竞争 线程状态多为BLOCKED,上下文切换频繁 优化锁粒度(局部锁代替全局锁),改用非阻塞容器(如ConcurrentHashMap)
低效算法 / 代码 热点方法是嵌套循环、字符串拼接等 优化算法(如 HashMap 替代遍历),用StringBuilder拼接字符串

方案二:使用 Arthas 工具(新手首选,可视化分析)

Arthas 是阿里开源的 Java 诊断工具,无需改代码、无需重启应用,可视化程度高,新手能快速定位问题,核心优势是「跳过手动转 16 进制、直接输出问题代码、生成火焰图」。

步骤 1:安装并启动 Arthas

复制代码
# 下载Arthas包
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 启动Arthas(会列出所有Java进程,输入对应序号回车)
java -jar arthas-boot.jar

步骤 2:核心排查命令(直接定位问题)

命令 作用 关键说明
thread -n 3 显示 CPU 占用最高的 3 个线程 直接输出线程状态、执行的类 / 方法 / 行号,无需手动转 16 进制,新手优先看这个
dashboard 实时监控 CPU、内存、线程、GC 全屏可视化展示,按q退出,快速判断整体状态(如 GC 是否频繁)
profiler start 启动 CPU 热点采样 采样 30 秒左右即可,不要采样过久
profiler stop 停止采样并生成火焰图 输出 HTML 文件路径,将文件下载到本地,浏览器打开后,红色块就是 CPU 占比最高的方法

步骤 3:常见根因及解决方法

与「方案一」的步骤 5 完全一致,找到问题代码后针对性优化即可。


总结

  1. 核心排查逻辑:无论用哪种方案,都遵循「定位 Java 进程 → 定位高 CPU 线程 → 找到问题代码 → 针对性优化」;
  2. JDK 原生工具:零依赖,适合无外网 / 无法安装工具的环境,需手动转 16 进制、分析日志;
  3. Arthas 工具:新手友好,可视化强,thread -n 3可直接定位问题代码,profiler火焰图能直观看到 CPU 热点方法。
相关推荐
Pniubi4 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko74 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师4 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.4 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼5 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
马良神笔6 小时前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD6 小时前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
福兮说7 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
高频因子挖掘机7 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机7 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api