Java开源工具库使用之线上监控诊断库Arthas

41 篇文章 2 订阅
30 篇文章 0 订阅

前言

在现代软件开发中,应用程序的监控和调试是非常重要的环节。特别是在复杂的 Java 应用程序中,排查问题、优化性能和定位异常往往成为开发者的一项挑战。针对这个问题,阿里巴巴开发了一款强大而灵活的 Java 诊断工具,名为 Arthas

Arthas 框架被誉为"Java开发者的神器",它旨在帮助开发者实时监控和深入调试 Java 应用程序,提供了丰富的功能和便捷的操作。无论是在开发、测试还是生产环境中,Arthas 都能够以低侵入性的方式提供全面的应用程序观测和问题诊断能力。

Arthas支持 JDK 6+,支持 Linux/Mac/Windows ,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断,当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到 JVM 的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从 JVM 内查找某个类的实例?

在本篇博文中,我们将全面介绍 Arthas 框架的基本概念和原理,详细探讨 Arthas 的常用操作以及如何使用它进行监控和调试。我们还将给出一些实际应用场景的示例,让读者能够更好地理解和运用 Arthas 来提升自己的 Java 开发调试能力。

一、介绍

1.1 功能

  1. 监控(Observability):Arthas 提供了实时监控 Java 应用程序运行状态和性能的功能。通过监控,开发者能够获得关键的运行指标,如方法调用、线程状态、堆栈跟踪等,从而可以全面了解应用程序的运行情况。
  2. 诊断(Diagnosis):Arthas 支持深入调试和诊断Java应用程序,帮助开发者定位和解决问题。开发者可以通过 Arthas 提供的命令行界面,进行方法追踪、变量修改、热替换等操作,以便更好地理解代码执行过程和解决潜在的问题。
  3. 命令行界面(Command-line Interface):Arthas 使用简洁而强大的命令行界面来操作和控制监控和诊断功能。开发者可以通过在命令行中输入特定的命令,来获取所需的监控数据、执行诊断操作或配置监控规则等。这种命令行交互的方式使得 Arthas 对于开发者来说非常方便和灵活。

总而言之,Arthas框架基于监控和诊断的概念,通过命令行界面,提供了实时监控和深入调试 Java 应用程序的能力。

1.2 原理

  1. 基于Java的 Instrumentation 机制和字节码增强技术:

    • Instrumentation 是 Java SE 5 引入的一个功能强大的 API,它允许开发者在运行时修改、替换或者重新定义字节码,而不用修改源代码。

    • Arthas利用Java的Instrumentation API,在目标应用程序的启动过程中动态加载字节码增强器。

    • 字节码增强器负责对目标应用程序的类进行字节码修改和增强。

  2. 目标应用程序的运行时监控和诊断:

    • Arthas的字节码增强器根据监控规则和命令行输入的指令,在目标应用程序的方法中插入自定义的代码逻辑。
    • 插入的代码逻辑会在方法调用前后、异常抛出等关键点触发,实现对目标应用程序的监控和诊断。
  3. 动态代理技术:

    • Arthas利用 Java 的动态代理技术,对目标对象进行包装,以便在方法执行前后添加额外的逻辑。
    • 这样,Arthas 可以实现对目标对象的监控和诊断,无需修改目标对象的源代码。

Arthas的核心原理是利用Java的Instrumentation机制和字节码增强技术,在 目标应用程序运行时动态地修改和增强其字节码,从而实现对目标应用程序的监控和诊断功能。这种低侵入性的设计使得Arthas可以在不停止应用程序的情况下对其进行实时监控和调试,极大地提高了开发者的效率和调试能力。

二、安装使用

2.1 下载

curl -O https://arthas.aliyun.com/arthas-boot.jar

上面jar包,第一次启动后会接着下载所需依赖包,如果不成功可直接在github上下载完整包

2.2 使用

使用和目标进程一致的用户启动,否则可能 attach 失败

java -jar arthas-boot.jar

进入命令行界面,需要选择想追踪的 java 进程

00

三、常用

3.1 实时查看

通过Arthas进行全局 JVM,线程,方法调用和堆栈跟踪分析

  • 使用dashboard 实时查看全局 JVM

    01

  • 获取实时线程的信息

    thread 1 #找到主线程
    
    thread -n 3 # 找到当前最忙的3个线程
    
    thread -b # 找出当前阻塞其他线程的线程,只支持找出 synchronized 关键字阻塞住的线程
    
    thread --state # 查看指定状态的线程
    

    02

  • 在所有匹配的方法调用处打印方法参数、返回值和执行时间等信息。

    trace demo.MathGame run
    trace com.example.MyClass *
    

    03_trace

  • watch

    对函数执行数据观测,让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值抛出异常入参,通过编写 OGNL 表达式进行对应变量的查看。

    4 个观察事件点,即 -b 函数调用前,-e 函数异常后,-s 函数返回后,-f 函数结束后(默认)

    # 查看运行方法超时的参数和返回结果
    watch demo.MathGame primeFactors '{params, returnObj}' '#cost>0.03' -n 1
    

    watch

3.2 追踪查看

  • watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测,这时tt 就可以发挥作用了,它能记录下当时方法调用的所有入参和返回值、抛出的异常

    可以通过tt -t 记录所有运行得方法,找到自己想要的,然后通过tt -i [index]查看具体参数,如果参数比较复杂,还可以通过-w 通过ognl表达式访问

    tt -t demo.MathGame primeFactors
    tt -i 1008
    tt -i 1008 -w 'params[0].obj'
    

    tt

    tt_01

    字段含义
    IS-RET方法是否以正常返回的形式结束
    IS-EXP方法是否以抛异常的形式结束

3.3 辅助命令

  • 强制GC

    vmtool --action forceGc
    
  • 重载方法

    有时匹配方法会碰到重载方法,可通过下面OGNL表达式挑选

    'params.length== 参数个数 && params[0] instanceof java.lang.String'
    

3.4 热更新

展示 Arthas 如何实现无需重启应用程序而进行热更新

retransform  /path/to/new/class/file
# 显示替换的类
retransform -l
# 根据id删除
retransform -d 1

注意:

  • 不允许新增加 field/method
  • 正在跑的函数,没有退出不能生效
  • 应该谨慎使用热更新,避免对系统稳定性和安全性产生负面影响

3.5 监控

使用monitor命令

# c	统计周期,默认值为 120 秒
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"

在这里插入图片描述

监控项说明
timestamp时间戳
classJava 类
method方法(构造方法、普通方法)
total调用次数
success成功次数
fail失败次数
rt平均 RT
fail-rate失败率

Arthas的监控功能灵活而强大,可以帮助开发人员及时发现和解决系统性能或行为问题。但需要注意的是,监控需要消耗一定的系统资源,因此应该合理设置监控规则,避免对系统产生额外的负担。

四、实战

4.1 CPU/内存占用过高

  • dashboard 查看占用CPU最高的线程名字,然后通过 thread ID 查看具体线程信息
  • 如果dashboard 面板的堆栈空间内存占用过多,可通过heapdump heapdump.hprof导出dump文件,用MAT 或 jvisualvm 查看

4.2 接口耗时高

  • 可通过trace demo.MathGame primeFactors 对应接口相关类和方法追踪
  • 还可以通过trace demo.MathGame primeFactors '#cost > 100' 将筛选耗时 >100ms 的方法

4.3 找到类所在jar

使用sc -d命令:使用以下命令进行类的查找:

  1. sc -d className
    

    其中,className为待查找的类的全限定名,例如demo.MathGame

  2. 查看结果:Arthas会输出类的相关信息,包括类所在的Jar包路径。在其中找到“code-source”一项,即可获得该类所在的Jar包路径。

    sc

注意事项:

  • 如果类尚未被加载,那么无法通过sc -d命令找到类所在的Jar包。
  • 如果类存在于多个Jar包中,Arthas 将只显示一个匹配。如果需要找到所有匹配的Jar包,可以使用sc -d className --deep命令进行深度查找。

4.4 查找类的实例

可以使用vmtool 获取实例

vmtool --action getInstances --className java.lang.String --limit 10

vm_tools

4.5 生成火焰图

开始采集:执行profiler start命令,开启性能分析。profiler 执行时间可以根据参数调整,如 --duration 10 --interval 500采样周期为500ms,持续10秒。
当命令执行完毕后,会在output目录下生成html文档,包含对应火焰图

此命令不支持windows

profiler start --duration 10 --interval 500

profiles

参考

  1. https://arthas.aliyun.com/doc/
  2. Arthas 看了官方文档还不会用?进来了解一哈~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aabond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值