首页 > 编程语言 >开源Java诊断工具Arthas:开篇之watch实战

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

时间:2023-08-21 23:12:27浏览次数:47  
标签:Java 全名 watch 表达式 Arthas 观察 类名

一、前言

  • 还在为排查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 次数,避免刷屏
    arthas-watch.png

2. 只想看满足条件的

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

3. 只想看耗时长的

  • 命令格式:条件 替换为 #cost>毫秒数
    arthas-watch-cost.png

4. 重载方法

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

5. 实现类 和 代理类 输出2次

  • 增加参数,非代理类才输出: --exclude-class-pattern *Enhance*
  • 不匹配子类:options disable-sub-class true
    arthas-watch-proxy.png

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
    arthas-watch-maxMatch.png

7. 观察异常

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

8. 观察函数调用前的入参

  • 这种情况比较少,一般是 入参、出参 是同一个 集合 或 对象,方法中修改了 内容
  • 命令格式:watch 类全名或类名表达式 函数名表达式 {观察表达式} -b,观察表达式 中 returnObj 是 null 哦,因为还没执行完返回

四、拓展

1. 怀疑代码不一致,jad 反编译 确认一下吧

  • 命令格式:jad 类全名或类名表达式 函数名表达式,方法名 是 可选的(代码行数多的类建议加 方法名,避免刷屏),不传就反编译整个类
  • 只显示源代码,不显示 ClassLoader、Location:--source-only
  • 不显示行号:--lineNumber false
    arthas-jad.png

2. 啥,jad 找不到类

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

五、总结

  • Arthas 可以帮我们诊断不少线上问题,如 查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
  • FAQ | arthas (aliyun.com)
  • 后记:想当年还用过 阿里大神开源的 greys,一转眼用 Arthas 也几年了,而 Arthas 也是基于 greys 开发的

本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明,否则将追究法律责任。
本文首先发布于 https://www.890808.xyz/ ,其他平台需要审核更新慢一些。

javalover123

标签:Java,全名,watch,表达式,Arthas,观察,类名
From: https://www.cnblogs.com/javalover123/p/java-arthas-watch-jad.html

相关文章

  • Java 引用传递
    首先,Java的数据类型有哪些?1.基本类型:编程语言中内置的最小粒度的数据类型。它包括四大类八种类型:4种整数类型:byte、short、int、long2种浮点数类型:float、double1种字符类型:char1种布尔类型:boolean2.引用类型:引用也叫句柄,引用类型,是编程语言中定义的在句柄中存放着实际......
  • 《深入理解Java虚拟机》读书笔记: 虚拟机类加载的时机和过程
    虚拟机类加载的时机和过程一、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称......
  • 本地nacos启动报错: Please set the JAVA_HOME variable in your environment, We nee
    编辑startup.cmd文件将模式从cluster改为standalone插入一行指定你的JAVA_HOME路径setJAVA_HOME="C:\dev_files\jdk17"然后启动nacos即可~......
  • 【java】[sql]使用Java程序向MySql数据库插入一千万条记录,各种方式的比较,最后发现inse
    转:https://www.cnblogs.com/heyang78/p/11666743.html我的数据库环境是mysqlVer14.14Distrib5.6.45,forLinux(x86_64)usingEditLinewrapper这个数据库是安装在T440p的虚拟机上的,操作系统为CentOs6.5.我的数据表是这样的:CREATETABLE`emp`(`Id`int(11)NOTNU......
  • java 批量插入数据
    转:https://blog.csdn.net/qq_35461948/article/details/130195282批量插入数据,常见的使用mybatisforeach插入的方式,原始的方式和批处理 1,常见的mybatisforeachxml<insertid="insertBatch"parameterType="java.util.List">insertintoCODEINFO(CODE_TY......
  • Java虚拟机规范
    来自GPT翻译,主要是找一些跟jvm指令与字节码相关的部分,来源:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html2.5. Run-TimeDataAreasJava虚拟机定义了各种运行时数据区,这些数据区在程序执行期间使用。其中一些数据区在Java虚拟机启动时创建,并且只有在Java虚拟......
  • Java学习IO流Day01
    io一、File2.1FIle概述File用来表示文件系统中的一个文件或者目录java.io包下2.2方法构造方法File(Stringpathname):通过指定路径名称创建一个新的FIle实例Filefile=newFile("D:\\demo.txt");File(Fileparent,Stringchild):根据父级目录对象和子文......
  • java中多线程使用方法
    线程互相独立可以同时运行一个线程不能多次启用并发和并行并发强调交替并行强调同时多线程实现方式继承Thread重写run方法下不能直接调用方法要调用start方法setname给线程命名getname获取线程名字实现Runnable接口先继承Runnable在创建Thread对象参......
  • JavaScript基础之基于数据类型和引用数据类型
    数据类型JavaScript的数据类型有7中,包括6个基本类型和一个引用类型基本数据类型:number,string,boolean,null,undefined,symbol引用数据类型:object(数组、对象、函数、正则等)基本数据类型和引用数据类型的区别存储方式基本类型:基本数据类型的值直接存储在改变量所分配的内存......
  • 《HTML CSS JavaScript 网页制作》JavaScript基本知识(简介、语法、事件、对象)
    一、JavaScript简介1、JavaScript特点脚本语言:是一种解释型的脚本语言,在程序运行过程中逐行进行解释;基于对象:可以创建对象,也能使用现有的对象;简单:采用的是弱类型的变量类型,对使用的数据类型未作出严格的要求;动态性:采用事件驱动,不需要经过web服务器就可以对用户的输入作出响应;跨平台......