目录
背景
Arthas是什么?
安装
使用arthas-boot(推荐)
启动
常用命令
一键生成arthas命令的插件(强烈推荐)
watch
一、命令语法结构
二、核心参数详解
三、实战场景
1. 基础观测 - 查看入参和返回值
2. 条件过滤 - 只关注特定参数
3. 异常捕获 - 定位NPE根源
4. 耗时监控 - 组合#cost变量
5. 对象深挖 - 追踪集合内部数据
6. 链式观测 - 结合OGNL表达式
jad
一、命令语法结构
二、核心参数详解
三、实战场景
1. 基础用法 - 反编译整个类
2. 过滤方法 - 只反编译特定方法
3. 源码对比 - 确认生产环境代码版本
trace
一、核心功能原理
二、核心参数矩阵
三、实战场景
1. 基础耗时分析
2. 条件过滤分析
3. 多层调用链路展开
4. 异步线程追踪
5. 重载方法区分
6. 异常路径追踪
背景
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。
Arthas是什么?
阿里巴巴开源的Java诊断工具Arthas(阿尔萨斯)是一款全能的运行时诊断神器,具备三大核心优势:
- 零侵入:无需重启应用或修改代码
- 全维度:支持方法级监控、类加载追踪、热修复等
- 可视化:提供命令行交互和Web Console两种操作方式
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
安装
使用arthas-boot
(推荐)
下载arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
启动
用java -jar
的方式启动
java -jar arthas-boot.jar
启动后如图:
常用命令
一键生成arthas命令的插件(强烈推荐)
watch
Arthas的watch
命令是动态观测方法调用数据的核心工具,能够实时捕获方法的入参、返回值、异常信息,是诊断代码逻辑问题的利器。
一、命令语法结构
watch 类全路径 方法名 "{观测表达式}" [条件过滤] [参数选项]
- 观测表达式:OGNL语法,支持多维度数据组合
- 条件过滤:
'#cost>50'
(耗时>50ms才触发) - 参数选项:控制观测行为(
-b
/-e
/-x
等)
二、核心参数详解
参数 | 作用 | 示例 |
| 观察方法调用前(Before)的状态 |
|
| 观察方法异常时(Exception)的堆栈 |
|
| 观察方法返回后(Success)的结果 |
|
| 指定对象展开层级(默认1层) |
(深入3层) |
| 最大捕获次数(避免无限输出) |
(只显示5次) |
三、实战场景
1. 基础观测 - 查看入参和返回值
watch com.example.UserService getUserById "{params,returnObj}" -x 2
👉 输出示例:
@ArrayList[@Object[][@Long[12345], // 参数1: userId=12345],@User{ // 返回值id=12345,name="张三",age=30}
]
2. 条件过滤 - 只关注特定参数
watch *OrderService createOrder 'params[0] > 1000' 'params[0].amount > 1000' -x 3
👉 当订单金额amount
超过1000时触发观测
3. 异常捕获 - 定位NPE根源
watch com.example.DataParser parse "{params,throwExp}" -e -x 2
👉 输出异常堆栈:
throwExp : java.lang.NullPointerException: Cannot read field "id"at com.example.DataParser.parse(DataParser.java:23)...
4. 耗时监控 - 组合#cost
变量
watch com.alibaba.dubbo.Provider invoke '#cost > 200' -n 3
👉 只显示执行耗时超过200ms的调用,最多捕获3次
5. 对象深挖 - 追踪集合内部数据
watch *UserDAO batchInsert '{params[0].![name], returnObj.size}" -x 4
👉 观测传入的用户名列表和插入后的记录数
👉 ![name]
表示遍历集合获取name属性
6. 链式观测 - 结合OGNL表达式
watch *ConfigLoader load "{ #map={ 'key1':params[0], 'result':returnObj } }" -x 3
👉 自定义数据结构,将入参和返回值封装成Map输出
jad
Arthas的jad
命令是实时反编译JVM加载类的利器,能快速查看内存中的字节码对应的Java源码,是排查类冲突、验证代码版本的必备工具。
一、命令语法结构
jad [--source-only] 类全路径 [方法名]
- 内存级反编译:直接读取JVM中的Class字节码
- 无需源码:即使生产环境没有源代码也能查看逻辑
- 动态验证:检查热更新后的代码是否生效
- 支持过滤:可指定反编译单个方法
二、核心参数详解
参数 | 作用 | 使用场景 |
| 仅显示Java源码(去除类加载信息) | 快速查看核心逻辑 |
| 显示行号(需LocalVariableTable存在) | 定位异常堆栈具体行 |
| 反编译指定方法 | 过滤复杂类的大方法 |
| 指定ClassLoader进行反编译 | 多ClassLoader环境精准定位 |
三、实战场景
1. 基础用法 - 反编译整个类
jad com.example.UserService# 输出示例
ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader@2c13b15
Location: file:/app.jarpublic class UserService {public User getUserById(Long id) {return userDao.query(id);}...
}
2. 过滤方法 - 只反编译特定方法
jad com.example.ConfigLoader loadConfig# 输出指定方法的反编译结果
3. 源码对比 - 确认生产环境代码版本
jad --source-only com.alibaba.dubbo.config.ProtocolConfig# 对比本地代码,检查是否有热修复或不同版本
trace
Arthas的trace
命令是方法调用链路追踪神器,专门用于分析代码执行路径中各子调用的耗时分布,快速定位性能瓶颈。以下从核心原理到高阶用法全面解析:
一、核心功能原理
trace [选项] 类全路径 方法名 [条件表达式]
- 火焰图式分析:展示方法内部调用链的树状结构
- 耗时统计:精确到每个子调用的耗时占比
- 智能过滤:通过条件表达式筛选需要监控的调用
- 动态插桩:基于字节码增强技术实现无侵入分析
二、核心参数矩阵
参数 | 作用 | 示例 |
| 最多监控次数(防刷屏) |
(只显示5次结果) |
| 耗时过滤条件(单位ms) |
|
| 跳过JDK原生方法调用 |
|
| 正则匹配增强(类+方法) |
|
| 显示可追踪的类列表 | 配合 使用 |
三、实战场景
1. 基础耗时分析
trace com.example.OrderService createOrder
👉 输出示例:
java复制
+---+--------+--------------+---------+-------+------+
|# |耗时占比 | 调用方法 | 调用次数 | 总耗时 | 平均 |
+---+--------+--------------+---------+-------+------+
|1 | 45.3% | UserDAO.query | 3 | 340ms | 113ms|
|2 | 32.1% | Redis.set | 5 | 241ms | 48ms |
2. 条件过滤分析
trace *UserService getUserById '#cost > 50' -n 3
👉 只显示单次调用总耗时超过50ms的请求,最多捕获3次
3. 多层调用链路展开
trace -E com.example.*Controller.* -j 3
👉 监控所有Controller类方法,展开3层调用深度
4. 异步线程追踪
trace --skipJDK=false java.util.concurrent.FutureTask get
👉 追踪线程池异步任务执行情况(需关闭JDK跳过)
5. 重载方法区分
trace com.example.Utils 'parse' params.length==2
👉 只监控有两个参数的parse重载方法
6. 异常路径追踪
trace com.example.PaymentService pay 'throwExp!=null'
👉 仅捕获出现异常的支付调用路径