共计 2106 个字符,预计需要花费 6 分钟才能阅读完成。
一、前言
- 还在为排查 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/,其余平台须要审核更新慢一些。
正文完