Arthas的使用与进阶
- Arthas使用与进阶
- 一、概述
- 二、快速安装
- windows下安装arthas
- Linux下安装arthas
- 卸载
- 在Linux/Unix/Mac平台
- Windows平台
- 三、快速入门:attach一个进程
- 1、准备
- 2、启动arthas
- 四、快速入门:常用命令接触
- 命令介绍
- 1、dashboard仪表板
- 2、通过Thread命令来获取到arthas的进程的Main Class
- 3、通过jad反编译Main Class
- 4、watch监视
- 5、退出arthas
- 五、基础命令
- 1、help
- 2、cat
- 3、grep
- 4、pwd
- 5、cls
- 6、session
- 7、reset
- 8、version
- 9、history
- 10、quit
- 11、stop
- 12、keymap
- 13、arthas命令行快捷键
- 后台异步命令相关快捷键
- 六、JVM相关命令
- 1、dashboard
- 2、Thread
- 3、jvm、sysprop
- 4、sysprop
- 5、sysenv
- 6、vmoption
- 7、getstatic
- 8、ognl
Arthas使用与进阶
一、概述
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
windows下安装arthas
如图,我这里先进入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
linux下安装arthas其实是和windows下安装的过程差不多。
首先下载jar包,使用命令curl -O https://arthas.aliyun.com/arthas-boot.jar
下载完成之后启动jar包,如图:
我们随便选择一个java进程之后,就会进入arthas的下载。
安装好的arthas文件会隐藏,所以我们使用ls -a
来查看。
退出arthas
quit
卸载
在Linux/Unix/Mac平台
删除下面的文件
rm -rf ~/.arthas/
rm -rf ~/logs/arthas
Windows平台
直接删除user home下面的.arthas
和logs/arthas
目录即可。
小结
因为jar包是绿色的,要卸载的话,直接删除两个目录即可。
1、arthas安装目录
2、arthas的日志记录目录
三、快速入门:attach一个进程
目标:通过案例快速入门
- 执行一个jar包
- 通过arthas来attach
- 进行几种常用的命令操作
步骤
1、准备
我们直接使用arthas安装好之后自带的jar包进行快速入门,如图。
math-game
是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
然后我们重新打开一个连接窗口,去进行使用arthas操作。
2、启动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。
我们也可以直接在浏览器中直接输入命令进行操作。
小结
- 启动被诊断进程
- 启动arthas-boot.jar,粘贴上面的进程
- 不但可以通过命令行的方式来操作arthas,也可以通过浏览器来进行访问。
四、快速入门:常用命令接触
目标
- dashboard仪表盘
- 通过thread命令来获取到
math-game
进程的 Main Class - 通过jad来反编译Main Class
- watch
命令介绍
1、dashboard仪表板
输入dashboard
,按回车/enter
,会展示当前进程的信息,按ctrl + c
可以中断执行。
注:输入前面部分的字母,按tab可以自动补全命令
- 第一部分是显示JVM中运行的所有线程:所在线程组、优先级、线程状态、cpu占用率、是否是后台进程等
- 第二部分显示的JVM内存的使用情况
- 第三部分是操作系统的一些信息和Java版本号
按q
或者ctrl+c
可以退出。
cls
清屏
2、通过Thread命令来获取到arthas的进程的Main Class
使用命令Thread
查看所有线程。
使用命令thread 1
会打印线程ID为1的线程的栈,通常是Main函数的线程。
3、通过jad反编译Main Class
4、watch监视
通过watch
命令来查看demo.MathGame#primeFactors
函数的返回值:
按q或者ctrl + c
可以停止监视。
watch demo.MathGame primeFactors returnObj
5、退出arthas
如果只是退出当前的连接,可以使用quit
或者exit
命令,arthas到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出arthas,可以执行stop
命令。
小结
五、基础命令
1、help
查看命令帮助信息
2、cat
打印文件内容,和linux中的cat命令类似
如果没有写路径,则显示当前目录下的文件
3、grep
匹配查找,和linux中的grep命令类似,但它只能用于管道命令。
只显示包含java字符串的行系统属性
sysprop | grep java
显示包含java字符串的行和行号的系统属性
sysprop | grep java -n
显示包含system字符串的10行信息
thread | grep system -m 10
使用正则表达式,显示包含2个o字符的线程信息
thread | grep -e "o+"
4、pwd
返回当前的工作目录
5、cls
清空当前屏幕区域
小结
6、session
查看当前会话的信息
7、reset
重置增强类,将被arthas增强过的类全部还原,arthas服务端关闭时会重置所有增强过的类。
还原指定类
reset Test
还原所有以List结尾的类
reset *List
还原所有的类
reset
8、version
输出当前目标Java进程所加载的Arthas版本号
9、history
打印历史命令
10、quit
退出当前arthas客户端,其它arthas客户端不受影响
11、stop
关闭arthas服务端,所有客户端全部退出
12、keymap
arthas快捷键列表以及自定义快捷键
13、arthas命令行快捷键
- 任何时候的tab键,会根据当前的输入给出提示
- 命令后敲 - 或 – ,然后按tab键,可以展示出此命令具体的选项
后台异步命令相关快捷键
ctrl + c
终止当前命令ctrl + z
挂起当前命令,后续可以 bg/fg 重新支持此命令,或kill掉ctrl + a
回到行首ctrl + e
回到行尾
六、JVM相关命令
1、dashboard
显示当前系统的实时数据面板,按q或者ctrl + c
退出
dashboard Overview of target jvm's thread, memory, gc, vm, tomcat info.
- ID:Java级别的线程ID,注意这个ID不能跟jstack中的naviteID一一对应
- NAME:线程名
- GROUP:线程组名
- PRIORITY:线程优先级,1-10之间的数字,越大表示优先级越高
- STATE:线程的状态
- CPU%:线程消耗的cpu占比,采样100ms,将所有的线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
- TIME:线程的运行总时间,数据格式为 分:秒
- INTERRUPTED:线程当前的中断位状态
- DAEMON:是否是daemon线程
2、Thread
查看当前JVM的线程堆栈信息
查看处于等待状态的线程
thread --state WAITING
3、jvm、sysprop
查看当前JVM的信息
线程相关
- COUNT:JVM当前活跃的线程数
- DAEMON-COUNT:JVM当前活跃的守护线程
- PEAK-COUNT:从JVM启动开始曾经活着的最大线程数
- STARED-COUT:从JVM启动开始总共启动过的线程次数
- DEADLOCK-COUNT:JVM当前死锁的线程数
文件描述符相关
- MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符
- OPEN-FILE-DESCRIPTOR-COUNT;JVM当前打开的文件描述符
4、sysprop
查看和修改JVM的系统属性
# 查看所有属性
sysporp
查看单个属性,支持通过tab补全
sysporp java.version
修改单个属性
sysporp user.country
user.country=US
sysporp user.country CN
5、sysenv
查看当前JVM的环境属性(system environment variables)
查看所有环境变量
sysenv
查看单个环境变量
sysenv USER
6、vmoption
查看、更新VM诊断相关的参数
查看所有的选项
vmoption
查看指定的选项
vmoption PrintGCDetails
更新指定的选项
vmoption PrintGCDetails true
7、getstatic
通过getstatic命令可以方便的查看类的静态属性
getstatic 类名 属性名
显示demo.MathGame类中的静态属性random
getstatic demo.MathGame random
8、ognl
执行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}'