当前位置: 首页 > news >正文

Arthas 使用攻略

目录

背景

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等)
二、核心参数详解

参数

作用

示例

-b

观察方法调用前(Before)的状态

watch *Service login -b

-e

观察方法异常时(Exception)的堆栈

watch *Dao query -e

-s

观察方法返回后(Success)的结果

watch *Util parse -s

-x

指定对象展开层级(默认1层)

-x 3

(深入3层)

-n

最大捕获次数(避免无限输出)

-n 5

(只显示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字节码
  • 无需源码:即使生产环境没有源代码也能查看逻辑
  • 动态验证:检查热更新后的代码是否生效
  • 支持过滤:可指定反编译单个方法
二、核心参数详解

参数

作用

使用场景

--source-only

仅显示Java源码(去除类加载信息)

快速查看核心逻辑

--lineNumber

显示行号(需LocalVariableTable存在)

定位异常堆栈具体行

--methodName

反编译指定方法

过滤复杂类的大方法

--classLoaderClass

指定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 [选项] 类全路径 方法名 [条件表达式]
  • 火焰图式分析:展示方法内部调用链的树状结构
  • 耗时统计:精确到每个子调用的耗时占比
  • 智能过滤:通过条件表达式筛选需要监控的调用
  • 动态插桩:基于字节码增强技术实现无侵入分析

二、核心参数矩阵

参数

作用

示例

-n

最多监控次数(防刷屏)

-n 5

(只显示5次结果)

#cost

耗时过滤条件(单位ms)

'#cost > 200'

--skipJDK

跳过JDK原生方法调用

--skipJDK false

-E

正则匹配增强(类+方法)

-E com.example.*Service

--list-class

显示可追踪的类列表

配合-E

使用


三、实战场景
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'

👉 仅捕获出现异常的支付调用路径

相关文章:

  • Java从入门到精通 - Java入门
  • PCB设计工艺规范(五)PCB尺寸、外形要求
  • 1295. 统计位数为偶数的数字
  • 学习笔记:Qlib 量化投资平台框架 — MAIN COMPONENTS Part Ⅲ
  • 6.应用层
  • 【计算机视觉】目标检测:深度解析Detectron2:Meta开源目标检测与图像分割框架实战指南
  • 2025年4月AI科技领域周报(4.21-4.27):大模型生态加速演进 通用AI开启产业融合新范式
  • element-plus + splitpanes 实现左右拖动控制宽度
  • (eNSP)Smart Link配置实验
  • 【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步
  • 一、OrcaSlicer源码编译
  • 晶振频率/稳定度/精度/温度特性的深度解析与测量技巧
  • ESP32开发之freeRTOS的信号量
  • 【GEO优化】知识图谱:构建业务语义的“认知网络”
  • 前端跨域问题详解:原因、解决方案与最佳实践
  • 文献分享:一种新的靶向TROP2抗体药物偶联物抗肿瘤疗效
  • HarmonyOS NEXT应用开发-Notification Kit(用户通知服务)notificationManager.cancelAll
  • 系统分析师-第十五章
  • 什么是基尔霍夫第一定律
  • 【11408学习记录】英语书信通知写作模板大全:5个高分句式+使用场景解析,速存每日一句拆解练习!
  • 向左繁华都市,向右和美乡村,嘉兴如何打造城乡融合发展样本
  • 关于“十五五”,在上海召开的这场座谈会释放最新信号
  • 北方旱情持续,水利部:大中型灌区春灌总体有保障
  • 西班牙葡萄牙遭遇史上最严重停电:交通瘫了,通信崩了,民众疯抢物资
  • 走访中广核风电基地:701台风机如何乘风化电,点亮3000万人绿色生活
  • 第二十届中国电影华表奖揭晓!完整获奖名单来了