开源Java诊断工具Arthas:开篇之watch实战
一、前言
- 还在为排查Java程序线上问题头痛吗,看我们用阿里开源的诊断神器 Arthas 来帮您
- 本文开篇主要介绍 阿里开源的诊断神器Arthas 3.7.0版本,watch、jad、classloader 命令,以 Debian 11、openjdk 11 为例
二、Arthas 简介和安装
1. 简介
- Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息
- 并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常
- 监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
2. 安装和启动
- 执行该程序的用户需要和目标进程具有相同的权限,最好和目标进程的用户一致
- 启动以后,输入 数字 选择要观察的进程,也可增加
--select jar名称自动选择进程,提高操作效率 - 还可以在 末尾增加 进程号(启动后也不用选择进程了)
curl -O https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar
三、watch命令
1. 基本用法
- 观察指定函数的调用情况,如 入参、返回值、抛出异常,通过编写 OGNL 表达式查看
- 命令格式:
watch 类全名或类名表达式 函数名表达式 {观察表达式} -x 输出深度 -n 次数 - 观察表达式:默认 {params, target, returnObj},分别是 参数列表、被观察对象、返回值
-x 输出深度:默认为 1,最大为 4。默认的 观察表达式中 params + 输出深度 1,只能输出 params 是否 empty,size 是 几,要看到内容就要加大 输出深度 或 改为params[0]- 很多时候,我们都不关注 被观察对象 target,指定 观察表达式 可以降低干扰,尤其是 属性多 或 输出深度大的时候
- 观察执行频繁的方法,最好指定 -n 次数,避免刷屏

2. 只想看满足条件的
- 如 测试环境 同时有其他人访问,只想看到自己的请求
- 命令格式:
watch 类全名或类名表达式 函数名表达式 {观察表达式} '条件' -x 输出深度 -n 次数

3. 只想看耗时长的
- 命令格式:条件 替换为
#cost>毫秒数

4. 重载方法
- 重载方法,可通过参数 个数、类型 筛选
- 命令格式:
watch 类全名或类名表达式 函数名表达式 {观察表达式} 'params.length== 参数个数 && params[0] instanceof java.lang.String

5. 实现类 和 代理类 输出2次
- 增加参数,非代理类才输出:
--exclude-class-pattern *Enhance* - 不匹配子类:
options disable-sub-class true

6. 匹配类数量超限(默认50个)
- 错误信息:The number of matched classes is 1501, greater than the limit value 50
- 增加参数
-m 数量,指定 Class 最大匹配数量,默认值为 50,注意值小于实际类匹配数时报错,也就是说 只能大于等于 类匹配数 - 类名表达式 包含
*导致匹配类太多的,建议把 类名表达式 写的更精确 - 子类太多:试试用 子类全名 + 方法,或 不匹配子类:
options disable-sub-class true,或 提高匹配类数量-m 2000

7. 观察异常
- 4 个观察事件点,即 -b 函数调用前,-e 函数异常后,-s 函数返回后,-f 函数结束后(默认)
- 命令格式:
watch 类全名或类名表达式 函数名表达式 {throwExp} -e

8. 观察函数调用前的入参
- 这种情况比较少,一般是 入参、出参 是同一个 集合 或 对象,方法中修改了 内容
- 命令格式:
watch 类全名或类名表达式 函数名表达式 {观察表达式} -b,观察表达式 中 returnObj 是 null 哦,因为还没执行完返回
四、拓展
1. 怀疑代码不一致,jad 反编译 确认一下吧
- 命令格式:jad 类全名或类名表达式 函数名表达式,方法名 是 可选的(代码行数多的类建议加 方法名,避免刷屏),不传就反编译整个类
- 只显示源代码,不显示 ClassLoader、Location:
--source-only - 不显示行号:
--lineNumber false

2. 啥,jad 找不到类
- 有一次,发版发了几次都看不到效果,原来是 发错服务了,囧,谁让服务名称前缀是一样的呢,只能怪自己了
- 手动要加载也是可以的,classloader | arthas (aliyun.com),需指定 classLoader,如下示例
classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load java.lang.String

五、总结
- Arthas 可以帮我们诊断不少线上问题,如 查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
- FAQ | arthas (aliyun.com)
- 后记:想当年还用过 阿里大神开源的 greys,一转眼用 Arthas 也几年了,而 Arthas 也是基于 greys 开发的
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明,否则将追究法律责任。
本文首先发布于 https://www.890808.xyz/ ,其他平台需要审核更新慢一些。

开源Java诊断工具Arthas:开篇之watch实战的更多相关文章
- 开源在线分析诊断工具Arthas(阿尔萨斯)--总结
阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯) arthas用法 启动demo java -jar arthas-demo.jar 启动 java -jar arthas-boot.jar at ...
- java 诊断工具——Arthas
该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...
- Java诊断工具Arthas
Java诊断工具Arthas 1. Arthas简介 Arthas是阿里开源的一个线上java诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类.昨天试用了一下,发现真是强大,解决了我工作两年的很多 ...
- Alibaba Java诊断工具Arthas之快速安装和简单使用
Alibaba Java诊断工具Arthas简单介绍 : 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception ...
- 【Java】15分钟快速体验阿里Java诊断工具Arthas
[墙裂推荐]15分钟快速体验阿里Java诊断工具Arthas : https://alibaba.github.io/arthas/arthas-tutorials?language=cn&i ...
- Arthas Alibaba 开源 Java 诊断工具
Arthas 用户文档 English Docs Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,A ...
- Java 诊断工具 Arthas 教程学习笔记
Java 诊断利器 Arthas,是阿里的一款开源工具.Github-alibaba/arthas 上可以看到它的介绍.了解它,主要是最近对分析 Java 错误堆栈比较感兴趣,机缘巧合看到了它. 本文 ...
- 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
github地址: Arthas English version goes here. Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Art ...
- 阿里JAVA诊断工具Arthas的初步使用
Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...
- Alibaba Java诊断工具Arthas查看Dubbo动态代理类
原创/朱季谦 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...
随机推荐
- 2021-07-13:恢复二叉搜索树。给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出
2021-07-13:恢复二叉搜索树.给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树.进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出 ...
- Selenium - 元素等待(2) - 显式等待/EC等待
Selenium - 元素等待 显式等待 显式等待是一种灵活的等待方式,需要声明等待的结束条件,当满足条件时会自动结束等待: 需要引入WebDriverWait包以及exception_conditi ...
- LeetCode 周赛 346(2023/05/21)仅 68 人 AK 的最短路问题
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. LeetCode 单周赛第 345 场 · 体验一题多解的算法之美 单周赛 345 概览 T1. 删除子串后 ...
- vue中嵌入MP4 只有声音没图像
最近一个项目需要在页面嵌入一段视频,当然首选iframe了,直接嵌入了youku的视频,没问题,我想ok了.于是将url替换为本地的MP4发现只有声音没有任何图片,奇怪了,我首先想到是不是vue项目使 ...
- 2021-i春秋秋季赛部分misc+re wp
两道re比较简单,没有什么好说的,misc的符号执行那题还有点意思,总的来说题目不难 CTFMakesMeAngr 给出了符号执行的中间语言,对着文档把汇编逻辑逆一下,发现是个凯撒加密,位移为14,注 ...
- 如何在2023年开启React项目
在这里,我想给你一个新的React项目入门的简要概述.我想反思一下优点和缺点,反思一下作为一个开发者所需要的技术水平,反思一下作为一个React开发者,每个启动项目都能为你提供哪些功能.最后,你将了解 ...
- c++函数重载 c/c++混合编程
C++语言支持函数重载实现原理: 名字改编(name mangling)具体步骤: 当函数名称相同时,会根据函数参数的类型.个数.顺序进行改编 对源码直接用C++编译器进行编译时,会按C++方式进行调 ...
- OpenAI发布ChatGPT函数调用和API更新
2023年6月13日,OpenAI针对开发者调用的API做了重大更新,包括更易操控的 API模型.函数调用功能.更长的上下文和更低的价格. 在今年早些时候发布gpt-3.5-turbo,gpt-4在短 ...
- 如何使用idea来查找所有未使用的代码?
背景 项目组需要对开发的项目进行一次清理,把一些未被引用的代码清理掉. 我们知道一段代码未被引用,那么代码通常是灰色的. 但是一个完整的项目,会存在成千上万个Java文件,如果一个一个看去需要花费太多 ...
- 将onnx的静态batch改为动态batch及修改输入输出层的名称
目录 背景 操作 修改输入输出层 修改输入输出层名称 完整代码 背景 在模型的部署中,为了高效利用硬件算力,常常会需要将多个输入组成一个batch同时输入网络进行推理,这个batch的大小根据系统的负 ...