Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas(阿尔萨斯)支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的tab自动补全功能,进一步方便进行问题的定位和诊断。
下载arthas-boot.jar,然后使用java -jar的方式启动。
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
如图,我这里先进入F盘,新建一个文件夹,用来存放Arthas文件。
然后进入该目录,下载Arthas。

注意,在运行第二条命令之前,先运行一个java进程在内存中,不然会出现找不到java进程的错误。
打印帮助信息
java -jar arthas-boot.jar -h
如果下载速度比较慢,可以使用aliyun的镜像
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
然后我们使用java -jar arthas-boot.jar运行Arthas。

这时Arthas会发现我们本地是没有Arthas的安装包的,这时会提示我们选择,这里我们选择2,1是我们在本地运行的Java进程。
选择2就会从网上去下载Arthas,从maven仓库中下载。

然后我们可以根据输出日志的文件存放路径,找到刚才下载的文件,我这里C:\Users\zal\.arthas\lib\3.6.6\arthas,是如图:

安装好之后会在C:\Users\zal该路径下生成两个文件夹,一个是.arthas,一个是logs,安装好的界面如图:

linux下安装arthas其实是和windows下安装的过程差不多。
首先下载jar包,使用命令curl -O https://arthas.aliyun.com/arthas-boot.jar
下载完成之后启动jar包,如图:

我们随便选择一个java进程之后,就会进入arthas的下载。

安装好的arthas文件会隐藏,所以我们使用ls -a来查看。

退出arthas
quit
删除下面的文件
rm -rf ~/.arthas/
rm -rf ~/logs/arthas
直接删除user home下面的.arthas和logs/arthas目录即可。

小结
因为jar包是绿色的,要卸载的话,直接删除两个目录即可。
1、arthas安装目录
2、arthas的日志记录目录
目标:通过案例快速入门
步骤
我们直接使用arthas安装好之后自带的jar包进行快速入门,如图。
math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。

然后我们重新打开一个连接窗口,去进行使用arthas操作。

(1)如果粘附成功,在math-game.jar的那个窗口中会出现日志记录的信息。
(2)如果端口号被占用,也可以通过以下命令换成另一个端口号执行
java -jar arthas-boot.jar --telnet-port 9992 -http-port -1
我们也可以通过浏览器访问arthas,如图,访问该地址

访问127.0.0.1:3658,注意这里的ip地址是127.0.0.1,不是你的服务器ip或者是虚拟机ip。

我们也可以直接在浏览器中直接输入命令进行操作。
小结
目标
math-game进程的 Main Class输入dashboard,按回车/enter ,会展示当前进程的信息,按ctrl + c可以中断执行。
注:输入前面部分的字母,按tab可以自动补全命令

按q或者ctrl+c可以退出。
cls清屏
使用命令Thread查看所有线程。

使用命令thread 1会打印线程ID为1的线程的栈,通常是Main函数的线程。


通过watch命令来查看demo.MathGame#primeFactors函数的返回值:
按q或者ctrl + c可以停止监视。
watch demo.MathGame primeFactors returnObj

如果只是退出当前的连接,可以使用quit或者exit命令,arthas到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出arthas,可以执行stop命令。
小结

查看命令帮助信息

打印文件内容,和linux中的cat命令类似
如果没有写路径,则显示当前目录下的文件

匹配查找,和linux中的grep命令类似,但它只能用于管道命令。

只显示包含java字符串的行系统属性
sysprop | grep java

显示包含java字符串的行和行号的系统属性
sysprop | grep java -n

显示包含system字符串的10行信息
thread | grep system -m 10

使用正则表达式,显示包含2个o字符的线程信息
thread | grep -e "o+"

返回当前的工作目录

清空当前屏幕区域
小结

查看当前会话的信息

重置增强类,将被arthas增强过的类全部还原,arthas服务端关闭时会重置所有增强过的类。
还原指定类
reset Test
还原所有以List结尾的类
reset *List
还原所有的类
reset

输出当前目标Java进程所加载的Arthas版本号
打印历史命令

退出当前arthas客户端,其它arthas客户端不受影响
关闭arthas服务端,所有客户端全部退出
arthas快捷键列表以及自定义快捷键


ctrl + c 终止当前命令ctrl + z 挂起当前命令,后续可以 bg/fg 重新支持此命令,或kill掉ctrl + a 回到行首ctrl + e 回到行尾
显示当前系统的实时数据面板,按q或者ctrl + c退出
dashboard Overview of target jvm's thread, memory, gc, vm, tomcat info.

查看当前JVM的线程堆栈信息


查看处于等待状态的线程
thread --state WAITING

查看当前JVM的信息

线程相关
文件描述符相关
查看和修改JVM的系统属性
# 查看所有属性
sysporp
查看单个属性,支持通过tab补全
sysporp java.version
修改单个属性
sysporp user.country
user.country=US
sysporp user.country CN

查看当前JVM的环境属性(system environment variables)
查看所有环境变量
sysenv
查看单个环境变量
sysenv USER
查看、更新VM诊断相关的参数
查看所有的选项
vmoption
查看指定的选项
vmoption PrintGCDetails
更新指定的选项
vmoption PrintGCDetails true
通过getstatic命令可以方便的查看类的静态属性
getstatic 类名 属性名
显示demo.MathGame类中的静态属性random
getstatic demo.MathGame random
执行ognl表达式,,这是从3.0.5版本新增的功能

调用静态函数
ognl '@java.lang.System@out.println("helloworld")'
获取静态类的静态字段
ognl '@demo.MathGame@random'
执行多行表达式,赋值给临时变量,返回一个list
ognl '#value1=@System@getProperty("java.home"),#value2=@System@getProperty("java.runtime.name"),{#value1,#value2}'

