Arthas神器入门:动态调试Java应用,轻松搞定生产环境Bug!

作为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)版本

github arthas地址

第二步启动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了:

watch 参数进阶

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的进阶技能!!!

相关推荐
LUCIAZZZ24 分钟前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
考虑考虑33 分钟前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积34 分钟前
一起来学 Langgraph [第三节]
后端
sky_ph1 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
涡能增压发动积1 小时前
一起来学 Langgraph [第二节]
后端
IDRSolutions_CN1 小时前
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
java·经验分享·pdf·软件工程·团队开发
hello早上好1 小时前
Spring不同类型的ApplicationContext的创建方式
java·后端·架构
roman_日积跬步-终至千里1 小时前
【Go语言基础【20】】Go的包与工程
开发语言·后端·golang
HelloWord~2 小时前
SpringSecurity+vue通用权限系统2
java·vue.js
让我上个超影吧2 小时前
黑马点评【基于redis实现共享session登录】
java·redis