凌晨三点,告警电话响起——线上服务 CPU 飙升,接口超时,用户无法下单。你睡眼惺忪地打开电脑,开始了一轮传统排查:
top找进程、top -Hp找线程、转十六进制、jstack抓栈、在数千行日志里找线索……半小时过去了,问题还没定位到。如果有一套工具,能让这个流程从 30 分钟缩短到 3 分钟,还能无需重启就完成诊断和热修复呢?Arthas 正是为此而生。
一、为什么需要 Arthas?
在 Arthas 出现之前,Java 生产环境排查是一套固定的“标准动作”:
| 步骤 | 命令 | 痛点 |
|---|---|---|
| 1. 找到 Java 进程 | ps -ef | grep java | 进程多了眼花缭乱 |
| 2. 查看 CPU 占用 | top -Hp [pid] | 只能看线程号,不知道是哪个业务 |
| 3. 线程 ID 转十六进制 | printf "%x\n" [tid] | 多一步转换,容易出错 |
| 4. 抓取线程快照 | jstack [pid] > dump.txt | 文件巨大,人工搜索效率极低 |
| 5. 分析 GC 情况 | jstat -gcutil [pid] 1s | 数据静态,无法实时联动 |
| 6. 分析堆内存 | jmap -histo [pid] | 可能触发 Full GC,影响线上 |
这套流程存在几个致命问题:
- 繁琐且耗时:一套流程走下来至少 10-15 分钟
- 瞬间快照:
jstack只能看到一瞬间的线程状态,对于间歇性故障可能抓不到现场 - 无法热修复:发现问题后必须重启才能修复
- 无实时联动:各个工具的数据是割裂的
Arthas 的出现彻底改变了这一切。它基于 Java Instrumentation API,在目标 JVM 进程启动后动态挂载 Agent,通过字节码增强技术修改已加载类的字节码,实现方法监控、参数捕获、类热替换等能力——全程无需重启,无需修改业务代码。
二、快速上手:5 分钟安装与连接
2.1 下载与启动
Arthas 的安装极其简单,只需要一个启动 Jar 包:
# 下载 arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 或使用 wget
wget https://arthas.aliyun.com/arthas-boot.jar
# 启动,选择目标进程
java -jar arthas-boot.jar
运行后,控制台会列出当前机器上所有 Java 进程:
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 12345 org.springframework.boot.loader.JarLauncher
[2]: 67890 org.apache.catalina.startup.Bootstrap
输入序号即可 attach 到目标进程,进入 Arthas 交互控制台。
⚠️ 生产环境注意事项:
- Arthas 与目标进程需具备相同的用户权限,否则 attach 可能失败
- 生产环境建议仅在排查时启用,排查结束后及时退出
- 若服务器无法访问外网,可提前下载 arthas 核心包离线部署
2.2 Dashboard:全局态势感知
连接成功后,第一个命令一定是 dashboard:
[arthas@12345]$ dashboard
它会实时展示:
- 线程列表:按 CPU 占用率排序,实时刷新
- 内存概况:堆内/堆外内存、新生代/老年代占用
- GC 情况:GC 次数和耗时
- 运行时信息:操作系统、JDK 版本、加载类数量
这个命令让你在 3 秒内 掌握应用的全局健康状况。
三、核心命令实战:从定位到修复
3.1 thread:线程诊断,揪出 CPU 飙升元凶
当 dashboard 显示某个线程 CPU 持续高位时,用 thread 命令深入分析:
# 查看 CPU 占用最高的 3 个线程的堆栈
[arthas@12345]$ thread -n 3
# 查看指定线程的详细堆栈
[arthas@12345]$ thread 123
# 查看线程状态分布(BLOCKED/WAITING/TIMED_WAITING 等)
[arthas@12345]$ thread --state BLOCKED
实战场景:某次线上 CPU 飙高到 200%(8 核),dashboard 发现 pool-7-thread-1 持续 90%+ CPU。用 thread 查看堆栈,发现卡在 java.util.regex.Pattern$CharProperty.match——原来是日志切面在处理超长 JSON 字符串时触发了正则表达式的回溯爆炸。
3.2 watch:方法监控,看穿每一次调用
watch 命令可以监控指定方法的入参、出参、异常和耗时:
# 监控方法的入参和返回值
[arthas@12345]$ watch com.example.service.OrderService createOrder '{params, returnObj}' -x 3
# 监控方法执行耗时,超过 100ms 时触发
[arthas@12345]$ watch com.example.service.OrderService createOrder '{params, returnObj}' '#cost>100'
# 监控方法抛异常时的参数
[arthas@12345]$ watch com.example.service.OrderService createOrder '{params, throwExp}' -e
参数 -x 3 控制打印深度,对于嵌套对象非常有用。
3.3 trace:方法调用链路,定位慢接口
trace 命令追踪方法内部的调用路径和每个子调用的耗时:
# 追踪方法调用,显示每个子调用的耗时
[arthas@12345]$ trace com.example.service.OrderService createOrder
# 只追踪耗时超过 50ms 的调用
[arthas@12345]$ trace com.example.service.OrderService createOrder '#cost>50'
# 追踪并统计调用次数(-n 指定次数后自动停止)
[arthas@12345]$ trace com.example.service.OrderService createOrder -n 10
输出结果会清晰地展示:哪个 SQL 执行了 800ms、哪个 RPC 调用花了 2 秒——慢接口的根因一目了然。
3.4 jad:反编译,确认线上代码版本
有时候你怀疑:线上跑的代码是不是最新版本? jad 命令可以直接反编译 JVM 中加载的类:
# 反编译指定类
[arthas@12345]$ jad com.example.service.OrderService
# 反编译并显示行号
[arthas@12345]$ jad com.example.service.OrderService --lineNumber
延伸阅读:本站此前的 《Java 17 → 21 → 25:生产环境 JDK 升级实战》 中提到,不同 JDK 版本对字节码的优化不同,
jad可以帮助确认升级后类的实际加载情况。
3.5 redefine / reset:热更新,无需重启修复
定位到问题代码后,Arthas 支持在线热更新:
# 1. 在本地修改代码,编译成 .class 文件
# 2. 上传到服务器
# 3. 执行热更新
[arthas@12345]$ redefine /path/to/OrderService.class
# 恢复被增强的类(还原为原始字节码)
[arthas@12345]$ reset com.example.service.OrderService
⚠️ 生产环境警告:热更新是强大的能力,但需谨慎使用。建议先在测试环境验证,生产环境操作前做好备份。
四、火焰图:让性能瓶颈“可视化”
如果说前面的命令是精准打击,火焰图就是全景扫描。Arthas 的 profiler 命令基于 async-profiler,通过采样分析而非代码注入,对应用性能的影响极小(通常开销在 1%-2%)。
4.1 火焰图的基本原理
火焰图是一种层次化的性能剖析可视化工具:
- Y 轴:表示调用栈深度,从下到上逐层调用,顶部是正在执行的函数
- X 轴:表示抽样数量(不是时间轴),宽度越宽 = 被采样到的次数越多 = 执行时间越长
- “平顶”(plateaus) :火焰图上宽阔的平台,代表主要性能热点
解读技巧:
- 寻找最宽的平台——那就是 CPU 消耗最大的方法
- 从顶部向下读——顶部是热点方法,下方是它的调用链
- 忽略”孤峰” ——很窄的尖峰可能是偶然采样,宽阔的平台才是真问题
4.2 CPU 火焰图:定位 CPU 热点
# 启动 CPU 采样(默认 event 就是 cpu)
[arthas@12345]$ profiler start
Started [cpu] profiling
# 查看采样状态
[arthas@12345]$ profiler status
[cpu] profiling is running for 30 seconds
# 查看已采集的样本数
[arthas@12345]$ profiler getSamples
15234
# 停止采样,生成火焰图(默认 SVG 格式)
[arthas@12345]$ profiler stop
profiler output file: /tmp/demo/arthas-output/20260621-143258.svg
# 指定输出 HTML 格式(支持交互式点击放大)
[arthas@12345]$ profiler stop --format html --file /tmp/result.html
生成的 SVG/HTML 文件需要下载到本地用浏览器打开,不能直接在服务器上用 IP:端口访问。
4.3 内存火焰图:分析分配热点
除了 CPU,profiler 还支持多种分析事件:
# 分析内存分配热点(定位频繁 GC 的根源)
[arthas@12345]$ profiler start -e alloc
# 分析锁竞争(定位并发瓶颈)
[arthas@12345]$ profiler start -e lock
# 分析缓存未命中(定位 CPU 缓存效率问题)
[arthas@12345]$ profiler start -e cache-misses
# 查看所有支持的事件
[arthas@12345]$ profiler list
实战场景:某 Spring Boot 应用频繁 Full GC,用 profiler start -e alloc 采样 30 秒生成内存火焰图,发现某个缓存类每秒分配数 GB 对象——原来是缓存刷新策略不当,每次都全量重建。
4.4 profiler 参数速查
| 参数 | 说明 | 默认值 |
|---|---|---|
-e, --event | 采样事件:cpu / alloc / lock / cache-misses | cpu |
-d, --duration | 采样时长(秒) | 无限制,需手动 stop |
-i, --interval | 采样间隔(纳秒) | 10,000,000(10ms) |
-f, --file | 输出文件路径 | 自动生成 |
-o, --format | 输出格式:html / svg / flat / traces / jfr | svg |
五、完整排查流程:CPU 飙升从定位到修复
下面用一个完整案例,串联所有命令:

Step 1 – dashboard:3 秒发现异常线程
Step 2 – thread:查看堆栈,定位到 LogAspect
Step 3 – watch:监控方法入参,发现超长 JSON(100KB+)
Step 4 – 根因分析:正则表达式 .* 在处理超长字符串时发生灾难性回溯
Step 5 – 修复方案:
- 临时方案:
redefine热更新,修复正则表达式 - 长期方案:日志切面增加字符串长度限制,超过阈值截断或跳过
Step 6 – profiler 验证:生成火焰图对比修复前后,确认热点消失
六、Arthas vs JDK 自带工具:定位效率对比
| 场景 | JDK 自带工具方案 | Arthas 方案 | 效率提升 |
|---|---|---|---|
| 找出 CPU 最高线程 | top -Hp + 转十六进制 + jstack 搜索 | thread -n 3 | 10倍 |
| 分析方法调用耗时 | 加日志、加埋点、重新发布 | trace 实时追踪 | 无需重启 |
| 查看方法入参 | 改代码加日志、重新发布 | watch 实时监控 | 无需重启 |
| 确认线上代码版本 | 找 Git 提交记录、比对 | jad 反编译 | 秒级 |
| 性能热点可视化 | 需要额外安装 profiler | profiler 火焰图 | 一体化 |
| 热修复问题代码 | 修改代码、重新发布、重启 | redefine 热更新 | 零停机 |
延伸阅读:本站 《Java 应用接入 Prometheus + Grafana 全记录》 介绍了监控告警体系的搭建——Arthas 解决的是告警后的根因定位,两者互补,共同构成完整的可观测性体系。
七、生产环境最佳实践
7.1 何时使用 Arthas
| 场景 | 推荐度 |
|---|---|
| 紧急线上故障排查 | ⭐⭐⭐ 强烈推荐 |
| 性能瓶颈定位 | ⭐⭐⭐ 强烈推荐 |
| 代码热修复(临时) | ⭐⭐☆ 谨慎使用 |
| 日常性能巡检 | ⭐☆☆ 不推荐(有性能开销) |
7.2 安全与性能注意事项
- 按需启用,用完即退:Arthas 仅用于排查时启用,排查结束后退出
- 生产环境先测试:复杂操作(如
redefine)先在测试环境验证 - 权限控制:确保 Arthas 与目标进程用户一致
- 采样时长控制:
profiler建议 30 秒到 2 分钟,长时间持续 profiling 会累积开销 - 容器环境注意:K8s 容器内需确保有必要的调试工具
7.3 2026 年 Arthas 新特性
截至 2026 年 6 月,Arthas 最新版本为 v4.2.2。值得关注的新特性包括:
- profiler 升级:内置 async-profiler 升级到 4.4,支持更稳定的性能采样
- 堆内存分析:vmtool 新增堆内存分析功能
- MCP 支持:Arthas 已接入 MCP(Model Context Protocol),AI 可直接调用 Arthas 的诊断能力
- JDK 25 支持:Arthas 4.x 已支持 JDK 8+,包括 JDK 17 / 21 / 25
- classloader-metaspace:新增命令,支持按 ClassLoader 统计 metaspace 内存
八、总结
Arthas 是每个 Java 开发者都应该掌握的线上排障神器。从 dashboard 全局监控,到 thread 定位异常线程,到 watch/trace 深入方法调用,再到 profiler 生成火焰图可视化性能热点,最后 redefine 实现零停机热修复——这一整套能力,让 Java 生产环境排查从 “被动救火”走向“主动定位” 。
掌握 Arthas,你将在凌晨三点的告警电话面前,从容不迫。
📌 系列拓展阅读:
- 《Java 17 → 21 → 25:生产环境 JDK 升级实战》——JDK 升级与 JVM 参数调优
- 《Java 应用接入 Prometheus + Grafana 全记录》——监控告警体系建设
- 《Spring Boot 3.4 Docker 镜像最佳实践(含分层构建)》——容器化部署基础
- 《WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境》——本地开发环境搭建
📚 参考文献:
- Arthas 官方文档. profiler 命令. https://arthas.aliyun.com/doc/profiler.html
- Arthas GitHub. Release arthas-all-4.2.0. https://github.com/alibaba/arthas/releases/tag/arthas-all-4.2.0
- 阿里云开发者社区. 一次线上CPU飙高排查实录:从Arthas到JVM调优的深入之旅. https://developer.aliyun.com/article/1679845
- 腾讯云开发者社区. 线上 JVM 故障秒解:Arthas 高阶用法与全链路定位实战指南. https://cloud.tencent.cn/developer/article/2654620
- CSDN. 从火焰图到字节码:Arthas进阶调试技巧全解析. https://blog.csdn.net/redis7keeper/article/details/154176940
- Apache Wiki. Arthas 在线诊断使用指南. https://cwiki.apache.org/confluence/









