一、是什么 点击跳转官方文档
Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,提供了丰富的功能,是排查jvm相关问题的利器。
在逛github时,发现了这款利器,深入了解之后,简直惊为天人。下面先列举一下它能做的一些事情:
1.提供性能看板,包括线程、cpu、内存等信息,并且会定时的刷新。
2.根据各种条件查看线程快照。比如找出cpu占用率最高的n个线程等
3.输出jvm的各种信息,如gc算法、jdk版本、ClassPath等
4.查看/设置sysprop和sysenv
5.查看某个类的静态属性,也可以通过ognl语法执行一些语句
6.查看已加载的类的详细信息,比如这个类从哪个jar包加载的。也可以查看类的方法的信息
7.dump某个类的字节码到指定目录
8.直接反编译指定的类
9.查看类加载器的一些信息
10.可以让jvm重新加载某个类
11.监控方法的执行,同时可以获取到执行的入参、出参以及抛出的异常
12.追踪方法执行的调用栈,以及各个方法的调用时间
二、怎么用
Arthas Install
下载arthas-boot.jar,然后用java-jar的方式启动:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
如果下载不成功可以试下:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
卸载
在 Linux/Unix/Mac 平台删除下面文件:
rm -rf ~/.arthas/
rm -rf ~/logs/arthas
Windows平台直接删除user home下面的.arthas和logs/arthas目录
常用命令: 简单介绍具体查看官网 点击跳转官方文档
dashboard
进入当前系统的实时数据面板,按 ctrl+c 退出。这个面板会实时刷新,其中包括线程信息、内存信息、gc信息、还有一些运行时的数据。
另外,当运行在Ali-tomcat时,会显示当前tomcat的实时信息,如HTTP请求的qps, rt, 错误数, 线程池信息等等。
jad
有时我们经常会不确定线上或者测试环境的包是否是我们修改过的,这时候就可以通过jad反编译来看下。
watch
- 让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
- watch的使用姿势比较丰富,可以在四个不同的场景观察方法的执行。比如方法调用之前、方法调用之后、方法异常之后、方法结束之后。默认观察的是方法结束之后。
- 如果观察的是方法结束之后的场景,由于入参可能在执行方法时被改变,所以此时输出的可能不是真正的入参。因此,要看真正的入参,要看方法调用之前的,也就是加上-b的参数。
- 另外,使用-b参数观察的话,则观察不到方法返回的结果以及抛出的异常了。
# 观察CommonTest的test方法
# 输出 入参、返回结果、抛出的异常 —— 输出的内容可以动态调整
# 后面跟着的是 条件表达式,表示耗时超过10ms才输出
# -n 表示只执行一次,-x表示 入参和返回结果的展开层次为5层
watch com.bjoiwernode.CommonTest test "{params,returnObj,throwExp}" '#cost>10' -x 5 -n 1
# 耗时大于10ms并且第一个参数等于1才输出
watch com.bjoiwernode.CommonTest test "{params,returnObj,throwExp}" '#cost>10 && params[0]==1' -x 5 -n 1
# 第一个参数大于1 并且第二个参数等于hello才输出
watch com.bjoiwernode.CommonTest test "{params,returnObj,throwExp}" 'params[0]>1 && params[1]=="hello"' -x 5 -n 1
# 第一个参数小于5或者第二个参数等于"world"就输出
watch com.bjoiwernode.CommonTest test "{params,returnObj,throwExp}" 'params[0]<5 || params[1]=="wolrd"' -x 5 -n 1
# 第一个参数的name字段等于world时才输出。
# 由于在方法执行过程中参数的name属性可能发生改变,因此加上-b才能观察到真正的入参
watch -b *.CommonTest test "{params,returnObj,throwExp}" 'params[0].name=="wolrd"' -x 5 -n 1
# 由于同时指定了-s和-b,所以方法被调用一次,就会输出2次结果(两个场景分开输出),分别是方法被调用前,和返回之后
# 注意,这里如果-n只设置成1,那么只会输出-b对应的输出,-s对应的输出由于没有次数了就无法输出了
watch *.CommonTest test '{params,returnObj,throwExp}' -x 5 -n 2 -s -b
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时,tt命令会记录每次方法调用的各种信息。它和watch有些相似但是它能记录下各个时间点的调用信息,之后随时查看,甚至replay这次调用。
基本使用
jad反编译得到方法名,类名。使用trace查看调用消息。使用watch查看出参入参信息