怎么排查线上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 热点方法。
相关推荐
蒸蒸yyyyzwd1 小时前
cpp对象模型学习笔记1.1-2.8
java·笔记·学习
qq_297574671 小时前
【实战教程】SpringBoot 集成阿里云短信服务实现验证码发送
spring boot·后端·阿里云
程序员徐师兄2 小时前
Windows JDK11 下载安装教程,适合新手
java·windows·jdk11 下载安装·jdk11 下载教程
RANCE_atttackkk2 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
五岳3 小时前
DTS按业务场景批量迁移阿里云MySQL表实战(下):迁移管理平台设计与实现
java·应用·dts
一起养小猫3 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
韩立学长3 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
zhougl9963 小时前
Java 所有关键字及规范分类
java·开发语言
Python 老手3 小时前
Python while 循环 极简核心讲解
java·python·算法
java1234_小锋3 小时前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言