文章目录
- 前言
- 一、介绍
- 1.1 功能
- 1.2 原理
- 二、安装使用
- 2.1 下载
- 2.2 使用
- 三、常用
- 3.1 实时查看
- 3.2 追踪查看
- 3.3 辅助命令
- 3.4 热更新
- 3.5 监控
- 四、实战
- 4.1 CPU/内存占用过高
- 4.2 接口耗时高
- 4.3 找到类所在jar
- 4.4 查找类的实例
- 4.5 生成火焰图
- 参考
前言
在现代软件开发中,应用程序的监控和调试是非常重要的环节。特别是在复杂的 Java 应用程序中,排查问题、优化性能和定位异常往往成为开发者的一项挑战。针对这个问题,阿里巴巴开发了一款强大而灵活的 Java 诊断工具,名为 Arthas 。
Arthas 框架被誉为"Java开发者的神器",它旨在帮助开发者实时监控和深入调试 Java 应用程序,提供了丰富的功能和便捷的操作。无论是在开发、测试还是生产环境中,Arthas 都能够以低侵入性的方式提供全面的应用程序观测和问题诊断能力。
- github: https://github.com/alibaba/arthas
- 官网:https://arthas.aliyun.com/
Arthas
支持 JDK 6+,支持 Linux/Mac/Windows ,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断,当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
在本篇博文中,我们将全面介绍 Arthas 框架的基本概念和原理,详细探讨 Arthas 的常用操作以及如何使用它进行监控和调试。我们还将给出一些实际应用场景的示例,让读者能够更好地理解和运用 Arthas 来提升自己的 Java 开发调试能力。
一、介绍
1.1 功能
- 监控(Observability):Arthas 提供了实时监控 Java 应用程序运行状态和性能的功能。通过监控,开发者能够获得关键的运行指标,如方法调用、线程状态、堆栈跟踪等,从而可以全面了解应用程序的运行情况。
- 诊断(Diagnosis):Arthas 支持深入调试和诊断Java应用程序,帮助开发者定位和解决问题。开发者可以通过 Arthas 提供的命令行界面,进行方法追踪、变量修改、热替换等操作,以便更好地理解代码执行过程和解决潜在的问题。
- 命令行界面(Command-line Interface):Arthas 使用简洁而强大的命令行界面来操作和控制监控和诊断功能。开发者可以通过在命令行中输入特定的命令,来获取所需的监控数据、执行诊断操作或配置监控规则等。这种命令行交互的方式使得 Arthas 对于开发者来说非常方便和灵活。
总而言之,Arthas框架基于监控和诊断的概念,通过命令行界面,提供了实时监控和深入调试 Java 应用程序的能力。
1.2 原理
-
基于Java的 Instrumentation 机制和字节码增强技术:
-
Instrumentation 是 Java SE 5 引入的一个功能强大的 API,它允许开发者在运行时修改、替换或者重新定义字节码,而不用修改源代码。
-
Arthas利用Java的Instrumentation API,在目标应用程序的启动过程中动态加载字节码增强器。
-
字节码增强器负责对目标应用程序的类进行字节码修改和增强。
-
-
目标应用程序的运行时监控和诊断:
- Arthas的字节码增强器根据监控规则和命令行输入的指令,在目标应用程序的方法中插入自定义的代码逻辑。
- 插入的代码逻辑会在方法调用前后、异常抛出等关键点触发,实现对目标应用程序的监控和诊断。
-
动态代理技术:
- 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 进程
三、常用
3.1 实时查看
通过Arthas进行全局 JVM,线程,方法调用和堆栈跟踪分析
-
使用
dashboard
实时查看全局 JVM -
获取实时线程的信息
thread 1 #找到主线程 thread -n 3 # 找到当前最忙的3个线程 thread -b # 找出当前阻塞其他线程的线程,只支持找出 synchronized 关键字阻塞住的线程 thread --state # 查看指定状态的线程
-
在所有匹配的方法调用处打印方法参数、返回值和执行时间等信息。
trace demo.MathGame run trace com.example.MyClass *
-
watch
对函数执行数据观测,让你能方便的观察到指定函数的调用情况。能观察到的范围为:
返回值
、抛出异常
、入参
,通过编写 OGNL 表达式进行对应变量的查看。4 个观察事件点,即 -b 函数调用前,-e 函数异常后,-s 函数返回后,-f 函数结束后(默认)
# 查看运行方法超时的参数和返回结果 watch demo.MathGame primeFactors '{params, returnObj}' '#cost>0.03' -n 1
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'
字段 含义 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 | 时间戳 |
class | Java 类 |
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
命令:使用以下命令进行类的查找:
-
sc -d className
其中,
className
为待查找的类的全限定名,例如demo.MathGame
。 -
查看结果:Arthas会输出类的相关信息,包括类所在的Jar包路径。在其中找到“code-source”一项,即可获得该类所在的Jar包路径。
注意事项:
- 如果类尚未被加载,那么无法通过
sc -d
命令找到类所在的Jar包。 - 如果类存在于多个Jar包中,Arthas 将只显示一个匹配。如果需要找到所有匹配的Jar包,可以使用
sc -d className --deep
命令进行深度查找。
4.4 查找类的实例
可以使用vmtool 获取实例
vmtool --action getInstances --className java.lang.String --limit 10
4.5 生成火焰图
开始采集:执行profiler start
命令,开启性能分析。profiler 执行时间可以根据参数调整,如 --duration 10 --interval 500
采样周期为500ms,持续10秒。
当命令执行完毕后,会在output目录下生成html文档,包含对应火焰图
此命令不支持windows
profiler start --duration 10 --interval 500
参考
- https://arthas.aliyun.com/doc/
- Arthas 看了官方文档还不会用?进来了解一哈~