开源 Java 诊断工具 Arthas:开篇之 watch 实战

一、前言
还在为排查 Java 程序线上问题头痛吗,看我们用阿里开源的诊断神器 Arthas 来帮您
本文开篇主要介绍 阿里开源的诊断神器 Arthas 3.7.0 版本,watch、jad、classloader 命令,以 Debian 11、openjdk 11 为例
二、Arthas 简介和安装
1. 简介
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息
并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常
监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
2. 安装和启动
执行该程序的用户需要和目标进程具有相同的权限,最好和目标进程的用户一致
启动以后,输入 数字 选择要观察的进程,也可增加
--select 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 可以帮我们诊断不少线上问题,如 查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
后记:想当年还用过 阿里大神开源的 greys,一转眼用 Arthas 也几年了,而 Arthas 也是基于 greys 开发的
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明,否则将追究法律责任。
本文首先发布于 https://www.890808.xyz/ ,其他平台需要审核更新慢一些。

版权声明: 本文为 InfoQ 作者【javalover123】的原创文章。
原文链接:【http://xie.infoq.cn/article/7ab985a06e6c6608539e17e7a】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论