本节目标
- 知道Arthas能帮我们做什么
- 知道如何安装Arthas
- 做一个基础的使用
Arthas简介
Arthas是阿里巴巴开源的一款java诊断工具,可以帮助开发人员在不修改代码或重启服务器的情况下快速定位线上问题。当线上项目发生令你郁郁寡欢甚至束手无策的故障时,Arthas能帮你解决如下问题:
- 通过性能看板发现占用cpu最高的线程。
- 通过内存分析,可以发现内存泄漏问题。
- 通过线程命令查看线程堆栈,从而找出死锁、线程阻塞等问题。
- 可以在线反编译class,从而确认是不是我们真正要上线的程序。
- 可以在线修改类,比如:加入打印信息等代码。
- 监控方法的执行。可以观察方法入参和出参信息;可以找出耗时的方法。
- 可以dump内存快照信息,分析GC日志,找出GC问题
Arthas支持JDK6+及其以上的JDK版本均可以使用,本节包括以后用于演示JDK版本是21。采用的Arthas的版本是目前最新的4.0.4版本。这里我试着形象的描述下Arthas,它很像是附着在程序外的一堆带着各式各样管子、针头的仪器,完全包裹住我们的项目程序,以获得程序的各种实时运行数据和状态。回忆下电影场景中满身插着各种针头、试管的被试验者--Arthas就是那个恐怖场景中的仪器。
中文文档地址:arthas.aliyun.com/doc/
Github地址:github.com/alibaba/art…
在线快速安装
安装Arthas
# 创建一个单独的目录用于安装Arthas
mkdir arthas
# 进入新创建的目录
cd arthas
# 下载arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 运行arthas-boot.jar
java -jar arthas-boot.jar
上面的方式是官方推荐的安装方式。但是如果服务器上没有任何java程序在运行的时候,仅仅会有几行提示:
安装math-game
为了可以初步体验Arthas的功能,可以下载官方一个叫math-game的demo程序。math-game做的事情是:每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
运行结果:
这个程序会一直运行,不管它。新开一个终端来执行Arthas的命令。
我们去Arthas下载目录下可以看看:
离线全量安装
下载地址
解压
# unzip命令解压
unzip arthas-bin.zip
# 如果安装了java环境,可以用jar解压
jar -xvf arthas-bin.zip
查看解压后目录
其实这里和在线安装时在:当前用户/.arthas/lib/4.0.4/arthas安装的内容是相同的。
初步感受Arthas
仪表盘纵观全局
[arthas@16437]$ dashboard
输入 da 然后按
TAB键可以自动补全, 按Ctrl + c可以中断执行
说明:
- 第一部分打印出来的信息,是关于线程的。包括:线程名、线程组、优先级、cpu占比等信息。
- 第二部分打印出来的信息,是关于内存的。包括:堆内存、eden、metaspace、非堆内存等信息。
- 第三部分打印出来的信息,是关于运行时环境。包括:操作系统、java的版本、处理器等信息。
查看线程信息
[arthas@8760]$ thread 1
这里1是dashboard显示的ID对应的值。这里会打印线程 ID=1的栈信息
反编译类
通过查看线程的信息知道main方法的执行,在demo.MathGame类中。
[arthas@8760]$ jad demo.MathGame
仅仅到这里就解锁了一个很常用的功能。看上线的代码,是不是最新的代码。
查看方法返回值
在上面反编译MathGame类时,能看到源码有如下的这个方法:
[arthas@8760]$ watch demo.MathGame primeFactors returnObj
能看到方法的返回值了:
这个watch命令默认只能观察函数结束后这个时间点的值。后续会详细介绍。
退出Arthas
# 退出当前连接, 附着到目标程序上的Arthas还会继续运行,端口保持开放状态。
[arthas@17923]$ quit
[arthas@17923]$ exit
# 完全退出
[arthas@17923]$ stop
总结
- Arthas是一个线上诊断和监控工具
- 如果线上的机器可以访问互联网,那么最好用在线快速安装方式安装Arthas;如果不能连接互联网,那么用离线全量安装方式安装Arthas。
- 在Arthas中可以用
TAB键进行自动补全, 按Ctrl + c可以中断执行 - dashboard可以看线程、内存和运行环境信息
- thread可以看线程信息
- jad可以在线反编译类
- watch可以查看方法的返回值
- quit、exit退出当前连接;而stop是完全推出。