开源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 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...
随机推荐
- Vue Element-ui 之 el-table自动滚动
首先是 div结构布局 <div id="scrollId">//对el-table盒子设置 id 属性 <div style="height: 100 ...
- .NET周报 【6月第1期 2023-06-04】
专题 - NanoFramework项目案例 如果有时间,我会在周报中加入一些专题和项目案例的分享,本周就是讨论.NET NanoFramework项目案例的专题,在讨论 NanoFramework ...
- [AGC055B] ABC Supremacy 题解
[AGC055B] ABC Supremacy 题解 题目描述 给定两个长度为 \(n\) 的字符串 \(a\),\(b\). 你可以进行若干次以下操作: 若 \(a\) 中的一个子串为 ABC,BC ...
- 逍遥自在学C语言 | 指针和数组的关联
前言 指针和数组之间存在着紧密的关系.在本文中,我们将探讨指针和数组的关系.指针算术和数组遍历.多维数组与指针以及指针数组和数组指针. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 ...
- mysql主从-主主架构设计
前言: 1. mysql主从.主主复制应用场景很多,其原理主推,从定时根据binlog增量拉取更新 2. 如果主/从机器硬件负载过高,或者网络延迟就会造成同步延迟 3. 延迟是必然,mysql复制同步 ...
- k8s驱逐篇(7)-kube-controller-manager驱逐-taintManager源码分析
概述 taintManager的主要功能为:当某个node被打上NoExecute污点后,其上面的pod如果不能容忍该污点,则taintManager将会驱逐这些pod,而新建的pod也需要容忍该污点 ...
- C++ 核心指南之资源管理(中)
C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup.Herb Sutter 等顶尖 C++ 专家创建的一份 C++ 指南.规则及最佳实践.旨在帮助大家正 ...
- 发布一个Visual Studio 2022 插件,可以自动完成构造函数依赖注入代码
赖注入(DI)在开发中既是常见的也是必需的技术.它帮助我们优化了代码结构,使得应用更加灵活.易于扩展,同时也降低了各个模块之间的耦合度,更容易进行单元测试,提高了编码效率和质量.不过,手动注入依赖项也 ...
- 学习C++这一篇就够了(提升篇)
C++中除了面向对象的编程思想外,还有另一种就是泛型编程 主要用到的技术就是模板 模板机制的分类: 函数模板 类模板 函数模板 作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体定制,用虚拟 ...
- 通用权限系统-Dozer对象转换
Dozer对象转换 介绍 Dozer 是一个 Java Bean 到 Java Bean 的映射器,它可以递归地将数据从一个对象复制到另一个.通常情况下,这些Java Beans将是不同的复杂类型. ...