Arthas 是阿里开源的 Java 诊断工具,无需修改代码 / 重启服务,即可在线排查 Linux 下 Java 服务问题,以下是从安装到核心用法的完整教程:
一、快速安装 & 启动
1. 安装(Linux 服务器上操作)
# 下载arthas-boot.jar(阿里官方源) curl -O https://arthas.aliyun.com/arthas-boot.jar # 启动(会列出当前Java进程,选择要监控的PID即可) java -jar arthas-boot.jar
启动后会显示类似如下列表,输入数字(比如1)选择要诊断的 Java 进程,回车进入 Arthas 控制台:
二、核心功能:替代 JConsole 的监控能力
1. 实时仪表盘(核心!替代 JConsole 的概览面板)
dashboard
2. 内存监控(对应 JConsole “内存”)
jvm
3. 线程监控(对应 JConsole “线程”)
# 查看所有线程状态(ID、名称、状态、CPU占用) thread # 查看阻塞/等待的线程(重点!排查卡顿) thread -b # 找出当前阻塞其他线程的“元凶”线程 thread -w # 查看处于WAITING状态的线程 # 查看指定线程的栈信息(替换为线程ID/名称) thread 46 # 查看ID=46的线程栈,对应JConsole“线程→栈跟踪”
三、高频诊断场景(比 JConsole 更强的功能)
1. 排查慢接口 / 方法
# 监控指定方法的执行耗时(替换为你的类+方法名)
trace com.xxx.Service queryData
# 追踪方法调用链路+耗时
watch com.xxx.Service queryData '{cost}' -x 2 # 查看方法执行耗时(单位:ms)trace
trace是 Arthas 中追踪方法调用链路的核心命令,能精准输出
①目标方法的总执行耗时;
②方法内部调用的所有子方法(包括第三方库、JDK 内置方法);
③每个子方法的执行耗时和占比;
④甚至能捕获方法执行中的异常。
简单说:trace 是 “追根溯源”,告诉你目标方法慢在哪个子步骤。
# 基础语法 trace 类全限定名 方法名 [可选参数] # 示例:追踪 com.xxx.Service 类的 queryData 方法 trace com.xxx.Service queryData
先找到接口的路径,执行命令,开始监听
trace com.hnevol.client.bases.controller.org.LibDeptController getBasicDeptTree
更进一步分析接口
查询耗时27%和48%分别属于查询和转换两个步骤
关键参数 & 进阶用法
watch
watch是 Arthas 中灵活的方法数据观测命令,可以:
①监控方法的入参、返回值、异常、执行耗时;
②按条件过滤(如只看耗时 > 500ms 的调用);
③自定义输出格式(只看你关心的字段)。
# 基础语法
watch 类全限定名 方法名 观测表达式 [可选参数]
# 示例:观测 queryData 方法的执行耗时
watch com.xxx.Service queryData '{cost}' -x 2内置变量(直接可用)
watch com.hnevol.client.bases.service.org.impl.LibDeptServiceImpl getBasicDeptTree '{params, returnObj}' -x 2trace vs watch:核心区别(怎么选?)
| 维度 | trace 命令 | watch 命令 |
|---|---|---|
| 核心能力 | 追踪方法内部调用链路,定位慢子方法 | 观测方法单次执行的关键数据(耗时 / 入参 / 返回值) |
| 耗时展示 | 全链路(总耗时 + 子方法耗时) | 仅目标方法的总耗时 |
| 适用场景 | 排查 “方法慢,但不知道慢在哪” | 排查 “方法耗时波动大 / 偶尔慢”,或验证入参 / 返回值是否异常 |
| 性能开销 | 稍高(需追踪子方法) | 极低(仅观测目标方法) |
2. 反编译类(排查代码是否生效)
jad com.xxx.Service # 反编译指定类,查看运行时的实际代码
jad com.hnevol.client.bases.service.org.impl.LibDeptServiceImpl
3. monitor: 方法执行频率 / 成功率监控(长期观测)
# 每5秒统计一次,监控queryData方法的执行情况 monitor -c 5 com.xxx.Service queryData
4. stack: 查看方法调用栈 (定位方法被谁调用)
# 查看queryData方法的调用栈(只输出前5次) stack com.xxx.Service queryData -n 5 # 只查看耗时>100ms的调用栈 stack com.xxx.Service queryData '#cost > 100'
5. tt: 方法执行数据录制 (回放问题)
录制方法的入参、返回值、耗时等数据,支持回放调用(复现偶发问题)
# 录制queryData方法的执行数据(记录前10次调用) tt -t com.xxx.Service queryData -n 10 # 查看录制的记录(会生成index编号) tt -l # 回放指定index的调用(复现问题,无实际业务影响) tt -p -i 1000 # 1000是录制的index编号
总结:
接口慢,定位慢子方法:trace -> stack
接口偶发失败/ 耗时波动:watch -> monitor -> tt
验证线上代码:jad
内存占用高:dashboard -> jvm
线程监控:dashboard -> thread
四、生产环境使用建议
1、必加 -n 参数:避免命令一直运行刷屏,比如 trace com.xxx.Service queryData -n 5(只看 5 次调用);
2、按耗时过滤:优先用 #cost > 阈值 筛选慢调用,比如 watch ... '#cost > 500'(只看超过 500ms 的调用);
3、权限一致:启动 Arthas 的用户需和 Java 进程运行用户一致(否则无权限监控);
4、低峰期测试:trace 命令有轻微性能开销,生产环境建议在低峰期使用。













还没有评论,来说两句吧...