场景题:CPU 100% 问题怎么排查?

CPU 100% 问题怎么排查?

方案 1:传统命令行( jstack )排查

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

执行 top 命令,按 P 键按 CPU 使用率排序,找到占用 CPU 最高的 Java 进程 PID(比如 13731)。

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

执行 top -Hp 进程PID(如 top -Hp 13731) ,-H 表示显示线程级信息,找到该进程内占用 CPU 最高的线程 PID(比如 13756)。

++步骤 3:转换线程++ ++PID++ ++为 16 进制++

因为 Java 线程栈中线程 ID 是 16 进制格式,需将线程 PID(13756)转成 16 进制(比如 0x35bc),可通过在线工具或命令 printf "%x\n" 13756 转换。

++步骤 4:导出线程栈并定位问题代码++

执行 jstack 进程PID > thread_stack.log (如 jstack 13731 > thread_stack.log),导出整个 Java 进程的线程堆栈;

打开 thread_stack.log,搜索 16 进制的线程 ID(0x35bc),即可看到该线程的完整堆栈:包括线程状态、执行的方法、代码行号(比如 TestController.java:23),从而定位到耗 CPU 的代码(通常是死循环、频繁 GC、高频循环计算等)。

方案 2:Arthas 工具排查

Arthas 是阿里开源的线上诊断工具,无需导出日志,实时排查更高效:

++步骤 1:安装并启动 Arthas++

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

# 启动并attach到目标Java进程
java -jar arthas-boot.jar

启动后会列出服务器上所有 Java 进程,输入对应编号选择高 CPU 的进程,进入 Arthas 控制台。

++步骤 2:实时查看线程 CPU 占用++

执行 dashboard 命令:查看实时面板(5 秒刷新),直观看到线程、内存、GC 等状态;

执行 thread 命令:按 CPU 使用率排序显示所有线程,直接找到占用 CPU 最高的线程 ID(比如 18)。

++步骤 3:查看线程堆栈定位代码++

执行 thread 线程ID(如 thread 18),直接输出该线程的完整堆栈,一眼看到耗 CPU 的方法和代码行(比如 TestController.high(TestController.java:23))。

相关推荐
Q26433650233 分钟前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
TDengine (老段)5 分钟前
工业数据十大痛点系列 · 第 6 篇
数据库·时序数据库·tdengine·涛思数据·idmp·工业数据分析·ai 分析数据
黄鹂鸟科技13 分钟前
进销存系统设计要点:从采购计划、库存监控到成本核算
后端·物联网·系统架构
撸串-研究生25 分钟前
基于Spring Boot的智慧社区垃圾分类与回收系统的设计与实现【附源码】
spring boot·后端·分类·垃圾分类·社区管理
悠仁さん26 分钟前
非类型模板参数的特化与偏特化
java·数据结构·算法
鬼手点金32 分钟前
上下文:Agent 的眼睛
java·前端·人工智能·git·深度学习
ly768939 分钟前
PostgreSQL 流复制与高可用切换:主从延迟、同步提交与 Spring Boot 读写分离的边界
数据库·spring boot·postgresql·读写分离·流复制·高可用切换
171320330计算机毕设编程1 小时前
计算机毕业设计 基于Hadoop的新能源汽车发展前景分析 LW PPT
java·大数据·hadoop·python·算法·随机森林·线性回归
技术小结-李爽1 小时前
【工具】怎么在终端中启动springboot项目?
java·spring boot·后端·maven