作为java开发,我们肯定都有在生产环境或者非本地环境遇到过bug,要是本地能复现还好,启动IDEA,运行程序一步步debug,总能找到问题的原因,但是如果遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?这个时候arthas 就出现了。
实战演示
例如我们现在有一个方法已经发布到线上去了,但是出现了bug,因为生产的数据和本地调试的数据会不同,但是我们又没有打印日志,就像这个方法一样:

这个时候我们出现了一个bug,导致了数据不正确,这个时候我们只需要在线上的服务器启动arthas 之后 watch 一下这个方法:
arduino
watch com.zxy.product.exam.service.support.patrol.PatrolRecordServiceSupport handle '{params,returnObj,throwExp}' -n 5 -x 3
然后在页面上重新想办法触发这个方法,接下来我们就会得到这样的数据:

可以看到,这里面有我们传进来的参数 (params):
less
@Object[][
@String[683945314725646336], # 参数1:字符串ID
@Integer[1], # 参数2:整型值1
@Optional[EMPTY], # 参数3:空Optional
@Optional[value=7c7c8a7b...], # 参数4:带UUID的Optional
@String[7c7c8a7b...] # 参数5:字符串UUID
]
还有 返回值 (returnObj):
ini
@Integer[2] # 方法返回整型值2
而第三个则是 异常 (throwExp):
csharp
null # 无异常抛出
这样拿到我们的参数和返回值之后,排查问题起来就容易非常多,而不需要重新在代码层面添加日志,重新发版了。通过这么一个简单的演示我们见识到了 arthas的强大之处。那么我们现在来认识一下 arthas。
什么是arthas?
Arthas
(阿尔萨斯) 是 Alibaba 开源的 Java 诊断工具,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
如何使用arthas?
第一步,下载arthas
其实arthas 也是一个jar包,我们需要把他下载到我们的本地或者服务器上面,下载地址:
bash
https://arthas.aliyun.com/arthas-boot.jar
或者直接去github上面下载他的release(arthas-bin.zip)版本
第二步启动arthas
得到这么一个jar包之后,我们就可以使用命令行启动起来了:
java -jar arthas-boot.jar

第一次启动较慢,我们稍微等待一下,如果太慢的化可以使用 aliyun 的镜像
css
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
启动的是arthas-boot.jar 这个jar包
第三步,选择一个java服务
这里我们也使用官方案例中的一个java服务的演示jar包:
lua
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
启动之后,我们重新启动arthas(在上面的命令行输入 stop 否则需要把原来的进程kill掉),就会出现我们刚刚的程序:

我们输入 7 之后按回车键即可进入arthas的命令行页面 ([arthas@26452]$
如图最后一行)。
第四步,watch
watch demo.MathGame primeFactors returnObj
这个命令的意思就是 监控 MathGame 类的 primeFactors 方法返回值,而我们反编译看看我们刚刚启动的jar包里面的primeFactors方法:

在看看我们的程序命令行(左边)和arthas命令行(右边)完全对得上!!

第五步,watch命令进阶
上面的案例只是非常简单案例,但是就像作者前面watch的方法,大家发现会很长:
arduino
watch com.zxy.product.exam.service.support.patrol.PatrolRecordServiceSupport handle '{params,returnObj,throwExp}' -n 5 -x 3
监控目标 :PatrolRecordServiceSupport类的handle方法 观察表达式 :{params,returnObj,throwExp}(监控入参、返回值、异常) 参数说明: -n 5:最多触发5次 -x 3:对象展开层级为3(控制输出深度)
你看又是 -n 又是 -x 这些都是什么意思?由于篇幅问题,而且死记硬背肯定效果非常差,所以我们直接去官网去看一下watch命令的参数都有什么就ok了:
IDEA插件
如果看到上面的同学可能会问,watch那么多参数我怎么记得住啊,而且每次都要写全限定类名加方法加参数,这不很麻烦吗?别急!!arthas插件来帮你来了!!
基于IntelliJ IDEA开发的Alibaba Arthas 命令生成插件,支持Alibaba Arthas 官方常用的命令

我们只需要在idea的插件广场搜索 arthas 即可一键安装这个插件,有了这个插件之后,我们只需要在我们需要watch的方法上面这样操作(鼠标右键)即可:

然后我们就会得到这样的命令:
arduino
watch demo.MathGame primeFactors '{params,returnObj,throwExp}' -n 5 -x 3
之后我们再跑到arthas的命令行输入即可:

OHHHHHHHHHHHHHH!!!
好啦,以上就是Arthas的入门指南啦!是不是感觉这个工具还挺酷的?通过Arthas,我们可以像"侦探"一样,轻松揪出Java应用中的各种"小毛病",再也不用因为生产环境中没有而日志抓耳挠腮了。
当然,Arthas的功能远不止这些,随着你用得越来越熟练,你会发现它还有很多隐藏的"大招"。比如,你可以用它来监控方法执行时间、动态修改代码,甚至还能在生产环境"热修复"问题!但是由于篇幅原因,就不再这里bb了。如果点赞过100,马上更新更多arthas的进阶技能!!!
