Arthas 在线诊断常用命令
更新时间:2026-09-18。Arthas 是阿里开源的 Java 在线诊断工具,最大价值是不用改代码、不用重启就能挂载生产进程排查。线程问题可配合 jstack 线程 Dump 分析实战,内存问题配合 jmap 堆 Dump 实战,dashboard/watch/trace 三件套的可复现实操见 Arthas 三件套操作手册。
一、挂载与全局面板
bash
java -jar arthas-boot.jar # 列出本机 Java 进程,选择要诊断的 PID
[arthas@12345]$ dashboard # 实时面板:线程、堆/非堆、GC、Runtimedashboard 一屏看到:各区堆使用、GC 次数耗时、线程状态分布、CPU/运行时信息,先建立整体判断。
二、核心命令
| 命令 | 作用 | 典型场景 |
|---|---|---|
thread | 线程列表/栈 | thread -n 3 看最耗 CPU 的 3 个线程;thread -b 找阻塞其他线程的锁持有者;thread --state BLOCKED |
watch | 观测方法调用 | 看入参、返回值、异常、耗时 |
trace | 调用链耗时 | 找一个方法内部哪一步最慢 |
stack | 谁调用了我 | 反向查调用路径 |
jad | 反编译已加载类 | 确认线上跑的是不是新版本 |
monitor | 方法成功率/RT 统计 | 周期统计调用次数、成功失败 |
redefine | 热更新字节码 | 紧急改日志/分支(慎用) |
ognl | 执行表达式 | 临时读静态字段/调静态方法 |
三、watch 与 trace 实战
bash
# 观测 createOrder 方法:入参 params、返回值 returnObj、异常 throwExp、耗时
watch com.example.OrderService createOrder \
'{params, returnObj, throwExp, #cost}' -x 3
# 只在耗时超过 500ms 时打印(降低开销)
watch com.example.OrderService createOrder '{params,#cost}' '#cost>500' -x 2
# 统计方法内部各子调用耗时,定位慢在哪一步
trace com.example.OrderService createOrder '#cost > 200'watch的-x控制对象展开层级,越大越详细也越贵。trace默认只追一层,多层链路可对慢的子方法继续 trace,或用--skipJDKMethod false。
四、确认版本与热修
bash
jad com.example.OrderService # 反编译,确认线上代码/分支是否最新
mc /tmp/OrderService.java -d /tmp # 内存编译
redefine /tmp/com/example/OrderService.class # 热更新(同类结构变更受限)五、生产使用坑
- attach 本身有成本:挂载会做字节码增强,敏感高峰期先评估;用完
stop/shutdown退出并恢复增强。 - watch 全量观测开销大:加条件表达式(
#cost>x、按参数过滤)、限制-n(执行 N 次后停止),避免对高 QPS 方法无差别增强。 - redefine 限制多:不能加字段/改方法签名、不能改类结构,只适合改方法体内逻辑的应急,且重启即失效,仍需走正式发布。
- 权限与安全:能看到方法入参(可能含敏感数据),生产环境要控制使用权限并脱敏。
- 容器内使用:要在目标容器内启动 Arthas,且 JVM 版本/架构匹配。
总结
Arthas 让你免重启挂载线上 JVM:先用 dashboard 建立全局,用 thread -n/-b 定位高 CPU 线程和死锁,用 watch 带条件地观测方法的入参、返回值、异常与耗时,用 trace 找出调用链里真正慢的子调用,用 jad 反编译确认线上版本,必要时用 redefine 做不改结构的应急热修;生产上要给 watch 加 #cost 过滤和 -n 次数限制、用完 stop 恢复增强、管控敏感数据权限、在容器内 attach,并记住 redefine 重启失效、正式修复仍要走发布流程。