背景
今天开始新的系列,这个系列也是我一直想写的,有几个原因迟迟没开始,一个是担心自己学艺不精,误人子弟,另一个是没有积累较多的使用案例,目前这两个问题已经不是问题,arthas大部分命令也都使用过,并且也积累了较多案例,是时候开始动笔。
要写什么内容,这个也是我一直思考的问题,官网的文档已经很详细,我觉得没有必要再写一份介绍如何使用的教程,arthas的魅力在于线上调试java的黑科技,这一点官网的几个简单示例是不足以展现的,因此我绝对本系列着重讲实战,通过具体的例子展现arthas神奇的黑科技。
既然要写实战,那为什么还要写入门篇,入门是让你知道arthas是个什么东西,怎么安装,知道这两点就够了,足以让你学习接下来的内容,入门还是很有必要的,就像你追一个妹子,再喜欢也要先了解对方的基本信息,投其所好,磨刀不误砍柴工。
什么是arthas
以下是官网的介绍
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 5. 是否有一个全局视角来查看系统的运行状况? 6. 有什么办法可以监控到JVM的实时运行状态? 7. 怎么快速定位应用的热点,生成火焰图?
通俗的讲,如果把jvm比喻一个女孩子,以前都是女孩子主动告诉你她心里想啥(日志),有时候又支支吾吾的没讲重点(忘记打印日志了),有了arthas后,就算她不说话,你也能知道她的想法,并且还能实时监控她的想法,如果有这个能力,天下应该没有追不到的女孩子,同样,如果有了这个工具,对于解决问题简直如虎添翼。
专业的讲,就是arthas允许你在jvm运行时注入进jvm,达到监控方法执行,跟踪函数调用栈,查看源码,重定义类等各种操作,而且无需重启服务器,无需添加额外参数,插拔式。
如果你还不明白arthas能干嘛,没关系,你可以当作看小说一样看完整个教程,通过一个个实例,就自然就知道arthas是什么,能干什么,为什么称之为黑科技。
安装
arthas的安装非常简单,只要下个zip包,然后运行里面的arthas-boot.jar
包即可,安装之前保证安装的用户包含java相关环境变量,能够使用java命令。
$ mkdir -p ~/arthas $ cd ~/arthas $ wget https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.7/arthas-packaging-3.1.7-bin.zip $ unzip arthas-packaging-3.1.7-bin.zip $ ll total 22108 -rw-r--r-- 1 oracle oinstall 8347 Dec 4 2019 arthas-agent.jar -rw-r--r-- 1 oracle oinstall 111090 Dec 4 2019 arthas-boot.jar -rw-r--r-- 1 oracle oinstall 403091 Dec 4 2019 arthas-client.jar -rw-r--r-- 1 oracle oinstall 11207868 Dec 4 2019 arthas-core.jar -rw-r--r-- 1 oracle oinstall 3739 Dec 4 2019 arthas-demo.jar -rw-r--r-- 1 oracle oinstall 10834260 Dec 4 2019 arthas-packaging-3.1.7-bin.zip -rw-r--r-- 1 oracle oinstall 5993 Dec 4 2019 arthas-spy.jar -rwxr-xr-x 1 oracle oinstall 3127 Dec 4 2019 as.bat -rwxr-xr-x 1 oracle oinstall 7744 Dec 4 2019 as-service.bat -rwxr-xr-x 1 oracle oinstall 28075 Dec 4 2019 as.sh drwxr-xr-x 2 oracle oinstall 78 Dec 4 2019 async-profiler -rwxr-xr-x 1 oracle oinstall 635 Dec 4 2019 install-local.sh
解压后运行arthas-boot.jar
$ java -jar arthas-boot.jar [INFO] arthas-boot version: 3.1.7 [INFO] Process 30318 already using port 3658 [INFO] Process 30318 already using port 8563 [INFO] Found existing java process, please choose one and hit RETURN. * [1]: 30318 weblogic.Server [2]: 18081 weblogic.Server [3]: 18378 weblogic.NodeManager [4]: 30317 org.apache.derby.drda.NetworkServerControl
输入你需要注入的java进程的数字,如果在这里你不知道你的程序是哪个进程,你可以退出用jps -v
命令确定进程号后再重新进入选择,输入数字后,arthas会尝试连接到该java进程,如果连接成功,会打印出arthas的logo
[oracle@bpm arthas]$ java -jar arthas-boot.jar [INFO] arthas-boot version: 3.1.7 [INFO] Process 30318 already using port 3658 [INFO] Process 30318 already using port 8563 [INFO] Found existing java process, please choose one and hit RETURN. * [1]: 30318 weblogic.Server [2]: 18081 weblogic.Server [3]: 18378 weblogic.NodeManager [4]: 30317 org.apache.derby.drda.NetworkServerControl 1 [INFO] arthas home: /home/oracle/arthas [INFO] The target process already listen port 3658, skip attach. [INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://alibaba.github.io/arthas tutorials https://alibaba.github.io/arthas/arthas-tutorials version 3.1.7 pid 30318 time 2020-06-05 00:07:59 [arthas@30318]$
并出现一个控制台,你可以输入命令,命令官网都有介绍,如果要退出输入shutdown
即可
arthas注入对性能是有一点影响的,因此调试完一定要记得shutdown
退出。
你可以在控制台输入dashboard
运行你的第一个arthas命令:)
其他
每次要到目录下运行java -jar arthas-boot.jar
命令还是太麻烦了,你可以通过alias命令自定义命令,具体做法如下
- 编辑
~/.bash_profile
文件 - 加入以下内容
alias arthas='java -jar /you/path/arthas-packaging-3.1.7-bin/arthas-boot.jar'
- 执行以下命令令其生效
source ~/.bash_profile
这样你在任何地方输入arthas
就可执行arthas。
本章完。
no comment untill now