Arthas又是国内牛逼JAVA大哥阿里巴巴开源的Java诊断工具,(真的给跪了,这才叫真的技术,整天写CRUD的都是🌶️🐓好吗,比如我),本人经过简单使用后,发现是真的牛逼,而且门槛没那么高,简单操作即可在线上排查问题。
以下内容已Windows平台为例。
1.下载Arthas
#到如下页面下载Arthas
https://arthas.aliyun.com/doc/en/download.html
或者直接使用此地址下载
https://arthas.aliyun.com/download/latest_version?mirror=aliyun
2.安装Arthas
其实,不用安装解压即可,解压后文件夹内容如下
3.启动Arthas
CMD 或 Windows Terminal(推荐)进入arthas目录下,执行如下命令
java -jar arthas-boot.jar
启动时Arthas会自动探测java进程,将所有java进程罗列出来,让你选择一个java进程进行诊断
接下来我们输入 3,回车,就会选择我们自己的java web应用进程,Arthas会attach到目标进程上,并输出日志:
4.查看Dashboard
输入dashboard,按回车
,会展示当前进程的信息,显示内容是不断滚动刷新的,按ctrl+c
可以中断执行。
5.输入thread查看线程信息
6.查看类加载器信息
#可使用如下命令查看类加载器信息
classloader
classloader -l
classloader -t
7.查看类信息
#模糊搜索已加载的类
sc *DataSourceUtil*
#打印类的详细信息
sc -d org.springframework.jdbc.datasource.DataSourceUtils
8.通过jad反编译class
如果我们想查看class文件对应的源码什么,可以使用jad命令进行反编译
#反编译输出到文件
jad org.springframework.jdbc.datasource.DataSourceUtils > D:/DataSourceUtils.java
可以看到反编译输出的java文件中,还输出了一些ClassLoader,Location等arthas输出的信息,因此如果直接用这个java文件进行内存编译是会报错的,如果我们想直接生成纯净的java源码文件,可以使用:
#反编译输出到文件,仅输出源码
jad --source-only org.springframework.jdbc.datasource.DataSourceUtils > D:/DataSourceUtils.java
可以看到这个时候没有了源码之外的信息
9.使用mc命令对修改后的java源码进行内存编译
比如,我们在已经将要进行热更新的Class通过上面的jad命令已经将源码反编译出来,这个时候我们可以在源码上修复我们的bug,修复之后,我们用新的编译好的class文件替换JVM中已经加载的class文件,就可以使得应用执行新的代码,起到热修复的效果。在替换class之前,我们首先要做的当然是先把java文件编译为class文件。
#对某个类进行内存编译,并输出class文件到指定目录
mc D:/DataSourceUtils.java -d D:/
10.使用redefine命令实现热更新代码
作为测试我们在反编译的源码中加入了如下内容,接下来我们将代码进行热更新,看看是否实现了我们的效果。
使用如下命令将新编译的class文件热更新到jvm中
redefine D:/org/springframework/jdbc/datasource/DataSourceUtils.class
当应用再次执行到getConnection方法的时候,输出如下:
至此,其实我们就修改了一个Spring boot项目中,从数据库连接池中获取数据库连接出现异常时的代码。
11.退出Arthas
如果只是退出当前的连接,可以用quit
或者exit
命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
使用quit和exit退出当前连接后,热修复的代码仍旧生效。因为Arthas仍然attach到目标进程。
如果想完全退出arthas,可以执行stop
命令。
可以发现,Arthas完全退出后,redefine过的类仍然生效!!!!!不会在Arthas shutdown时被reset,reset重置的是monitor等命令增强过的类!!!
写在最后,使用Windows Terminal (PowerShell,cmd)操作Arthas体验不是特别好(直接用CMD也是如此),比如删除键不能使用,无法修改输入错误的命令;↑键也不能用来快捷执行上一条命令。其实,Arthas是提供了网页版客户端的,在浏览器中输入网址:
http://127.0.0.1:3658, 网页版没有上述两个问题,不过全屏在我这里有bug,各位看官各取所需吧。