开源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 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...
随机推荐
- openstack部署2
检查服务,查看dashboard页面有哪些功能 检查服务状态 检查计算节点,控制节点服务是up状态 检查网络节点是True的状态.这里的每个计算节点,都是一个neutron的客户端. 查看dashbo ...
- django 与 vue 的完美结合
django 与 vue 的完美结合 最近接到一个任务,就是用 django 后端,前段用 vue,做一个普通的简单系统,我就是一搞后端的,听到 vue 也是比较震惊,之前压根没接触过 vue.看 ...
- 记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题
在项目里刚好有3个服务,同一个网关内层的3个服务,两个php的,一个golang的,为了提高负载以及进行分流,部分客户的接口调用会被网关自动分配到go服务. 恰好为了测试,我写了一个全量用户的生产.测 ...
- 从0搭建Vue3组件库(十三):引入Husky规范git提交
为什么要引入 husky? 虽然我们项目中引入了prettier和eslint对代码格式进行了校验,但是多人开发的时候难免依然会有人提交不符合规范的代码到仓库中,如果我们拉取到这种代码还得慢慢对其进行 ...
- mybatis拦截器实现数据权限
前端的菜单和按钮权限都可以通过配置来实现,但很多时候,后台查询数据库数据的权限需要通过手动添加SQL来实现. 比如员工打卡记录表,有id,name,dpt_id,company_id等字段,后两个表示 ...
- 驱动开发:内核RIP劫持实现DLL注入
本章将探索内核级DLL模块注入实现原理,DLL模块注入在应用层中通常会使用CreateRemoteThread直接开启远程线程执行即可,驱动级别的注入有多种实现原理,而其中最简单的一种实现方式则是通过 ...
- TransformersandNLPforVideoUnderstanding
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 <Transformers and NLP for Video Understanding> 1 ...
- Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- C++面试八股文:什么是空指针/野指针/悬垂指针?
某日二师兄参加XXX科技公司的C++工程师开发岗位第30面: 面试官:什么是空指针? 二师兄:一般我们将等于0/NULL/nullptr的指针称为空指针.空指针不能被解引用,但是可以对空指针取地址. ...
- 白嫖一个WebAPI限流解决方案
什么是API限流: API 限流是限制用户在一定时间内 API 请求数量的过程.应用程序编程接口 (API) 充当用户和软件应用程序之间的网关.例如,当用户单击社交媒体上的发布按钮时,点击该按钮会触发 ...