功能介绍
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas(阿尔萨斯)能为你做什么?
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
原理 (watch | trace)
问题: 那么Arthas是如何attach到Jvm,又是如何实现watch、trace命令?
回答1:
- Jdk5增加了一个包java.lang.instrument,提供了对Jvm底层组件的访问能力。 Jdk6以后,针对这点进行了改进,开发者可以在main函数执行之后再启动自己的Instrument应用,入口是agentmain函数。arthas就是通过这个实现的。
- 之后就可以通过addTransformer,retransformClasses,redefineClasses等方式对字节码进行增强和热替换了。
回答2:
- ASM是一个Java字节码操作框架,用来动态生成class或者增强class,cglib的底层就是它,arthas也是通过它实现对class的增强的。
- Arthas增强功能的核心是Enhancer和AdviceWeaver这两个类,对方法进行Aop织入,达到watch,trace等效果。
具体细节, 在此不做深究,以应用为主,感兴趣的可以查看jdk相关源码
安装
安装arthas-boot
curl -O https://arthas.aliyun.com/arthas-boot.jar
IDEA 安装arthas plugin
找到被监控的pid
jps | grep xxxx
java -jar arthas-boot.jar
监控代码出入参以及异常 (watch)
选择需要被监控的代码位置, 右键
该例子的arthas watch, params代表入参,returnObj代表返回对象,throwExp表示程序运行异常
watch com.xxx.xxx.xxx.impl.controller.DictionaryController listDictionary '{params,returnObj,throwExp}' -n 5 -x 3
丢到arthas-boot中,并执行
执行一边接口,即可看到入参,返回对象以及运行异常 (哪里不会点哪里)
当然还有以下常用功能
- dashboard
- thread -b
- trace (用的少,一般watch也就完全定位到了,除非调用链路很长)
- hot swap (代码热更新, 本地代码修改,直接覆盖线上jvm的代码,慎用,除非死马当活马医)