Arthas dashboard/watch/trace 三件套实战
更新时间:2026-09-18。本篇是 P2 操作手册;机制与全命令见 Arthas 在线诊断常用命令,线程类问题配合 jstack 线程 Dump。
这个工具是做什么的
Arthas 通过 attach 到目标 JVM、做字节码增强,让你不重启、不改代码就实时观测 Java 进程。最常用的三件套:dashboard(总览)、watch(看方法数据)、trace(看调用链耗时)。
bash
java -jar arthas-boot.jar # 选择目标 PID(容器内在目标容器内执行)一、dashboard:先看全局
bash
[arthas@12345]$ dashboard一屏看到:线程状态分布与 CPU 占用、堆/非堆各区使用、GC 次数与耗时、Runtime 信息。先判断是 CPU、内存还是 GC 问题,再决定下钻方向(按 q 退出面板)。
二、watch:观测一个方法
bash
# 入参 params、返回值 returnObj、异常 throwExp、耗时 #cost
watch com.example.OrderService createOrder \
'{params, returnObj, throwExp, #cost}' -x 3
# 只抓慢调用(>500ms),最多打印 5 次后自动停止
watch com.example.OrderService createOrder '{params,#cost}' \
'#cost > 500' -n 5 -x 2
# 只在抛异常时观测(-e 异常时触发),打印第一个入参
watch com.example.UserService login '{params[0], throwExp}' -e -n 3| 选项 | 含义 |
|---|---|
-x <n> | 结果对象展开层级,越大越详细、越贵 |
-n <n> | 命中 N 次后自动退出增强 |
-e / -s | 仅异常 / 仅正常返回时触发 |
| 条件表达式 | 第二个位置参数做 OGNL 过滤,如 #cost>500、params[0].id==1 |
三、trace:定位调用链慢点
bash
# 统计 createOrder 内部每个子调用耗时,只展示 >200ms 的路径
trace com.example.OrderService createOrder '#cost > 200' -n 3
# 多层链路:对最慢点继续 trace,或提高跳层数
trace com.example.OrderService createOrder --skipJDKMethod false -n 3trace 给出「父方法 → 各子方法」的耗时与占比,逐层下钻即可找到真正慢的那一步(如下游 RPC、SQL)。配合 stack <类> <方法> 可反查「谁调用了这个方法」。
四、确认线上版本
bash
jad com.example.OrderService # 反编译已加载类,确认跑的是不是新版本/分支常见坑
- 生产 attach 与增强开销:watch/trace 是字节码增强,高 QPS 方法无差别增强会明显拉高 RT;务必加条件表达式和
-n限制,用完执行stop退出并恢复。 -x给太大:展开深层大对象开销高、输出刷屏,从小往大加。- trace 只追一层:深层慢点要对慢子方法继续 trace,不是一次全展开。
- 看得到敏感入参:方法参数可能含密码/手机号,注意权限与脱敏。
- 方法没匹配上:先
sc -d <类名>、sm <类名> *确认类已加载、方法签名(重载要带参数描述符)。
总结
Arthas 三件套按「全局→方法→链路」下钻:dashboard 先判断 CPU/内存/GC 方向,watch 用 OGNL 表达式观测指定方法的入参、返回值、异常与耗时并靠 #cost 条件和 -n 控制开销,trace 统计父方法内各子调用耗时逐层定位慢点,jad 用于确认线上实际版本;生产上必须给 watch/trace 加过滤条件和命中次数、控制 -x 展开层级、用完 stop 恢复增强并注意入参敏感数据,容器内 attach 要在目标容器执行。