背景

今天开始新的系列,这个系列也是我一直想写的,有几个原因迟迟没开始,一个是担心自己学艺不精,误人子弟,另一个是没有积累较多的使用案例,目前这两个问题已经不是问题,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。

本章完。

Trackback

no comment untill now

Add your comment now