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

简介: 还在为排查Java程序线上问题头痛吗,看我们用阿里开源的诊断神器 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/ ,其他平台需要审核更新慢一些。

相关文章
|
6天前
|
监控 Java 开发者
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
【5月更文挑战第21天】本文介绍了Java性能优化的两个利器——JProfiler和VisualVM。JProfiler通过CPU Profiler、内存分析器和线程视图帮助解决过度CPU使用、内存泄漏和线程阻塞问题;VisualVM则聚焦于GC行为调整和类加载优化,以减少内存压力和提高应用性能。使用这些工具进行定期性能检查,是提升Java应用效率的关键。
23 0
|
2天前
|
存储 Java
Java语言中的类与对象:深入解析与实战应用
Java语言中的类与对象:深入解析与实战应用
|
2天前
|
设计模式 Java 数据库连接
JAVA设计模式解析与实战
本文探讨了Java中的常见设计模式,包括单例模式、工厂模式和观察者模式。单例模式确保类只有一个实例,常用于管理资源;工厂模式通过抽象工厂接口创建对象,降低了耦合度;观察者模式实现了一对多的依赖关系,当主题状态改变时,所有观察者都会收到通知。理解并运用这些设计模式能提升代码的复用性、可扩展性和可维护性。
|
2天前
|
Java 程序员
JAVA集合框架详解与实战
这篇文档介绍了Java集合框架,包括Collection、List、Set和Queue接口及其常用实现类。List允许重复元素,如ArrayList和LinkedList;Set不允许重复,如HashSet和TreeSet;Queue支持队列操作,如LinkedList。文章通过代码示例展示了这些接口的使用方法,强调了集合框架在实际开发中的重要性及选择合适集合类型以优化代码的必要性。
|
2天前
|
Java Android开发 数据安全/隐私保护
JAVA编程的魅力与实战应用
这篇文章探讨了JAVA编程语言的魅力和实战应用。JAVA凭借其平台无关性、面向对象编程、高安全性和庞大的开发者社区,成为开发者首选。在Web开发中,JAVA的Spring等框架简化了开发过程;在安卓开发中,JAVA是构建移动应用的基础。无论是Web应用的高效开发还是安卓应用的广泛普及,JAVA都展现出强大功能和广阔的应用潜力。
|
2天前
|
前端开发 JavaScript Java
JAVA Web开发入门与实战
本文引导读者入门JAVA Web开发,介绍了Web开发的基本概念,如Servlet、JSP和JavaBean,并详细阐述了JAVA Web开发环境的搭建。文章通过一个在线书店系统的实战项目,展示了从需求分析、数据库设计到前后端开发的全过程,涵盖Servlet处理请求、JSP动态生成页面及表单添加书籍功能。最后,文章提及了进阶技术,如框架使用、前端集成和安全性考虑,鼓励读者深入探索JAVA Web开发的广阔世界。
|
4天前
|
Java Windows
用Java手搓一个转义工具
本文介绍了转义符的概念及其在编程中的作用,如`\n`、`\t`等,用于表示特殊字符。在Java中,通过`Scanner`接收用户输入,利用`escapeString`方法转义字符串中的特殊字符。示例代码展示了如何实现这一功能,读取用户输入,转义后打印结果。
13 2
|
4天前
|
存储 缓存 自然语言处理
es的java实战
【5月更文挑战第22天】Elasticsearch (ES) 是一个强大的分布式搜索和分析引擎,它可以处理大量的数据并支持复杂的搜索需求。
11 1
|
Arthas 监控 Java
arthas 阿尔萨斯 Java诊断工具
Arthas 是Alibaba开源的Java诊断工具,Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
3655 0
arthas 阿尔萨斯 Java诊断工具
|
1天前
|
Java 开发者
Java中的多线程编程:理解、实现与性能优化
【5月更文挑战第25天】 在Java中,多线程编程是实现并发执行任务的关键手段。本文将深入探讨Java多线程的核心概念,包括线程的创建、生命周期、同步机制以及高级特性。我们将通过实例演示如何有效地创建和管理线程,同时着重分析多线程环境下的性能调优策略和常见问题解决方法。文章旨在为读者提供一个全面的视角,帮助其掌握Java多线程编程的技巧,并在实际开发中避免潜在的并发问题,提升程序的性能和稳定性。