Arthas
是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
使用arthas-boot
下载arthas-boot.jar,然后用java -jar的方式启动:
1wget https://alibaba.github.io/arthas/arthas-boot.jar
2java -jar arthas-boot.jar
使用as.sh
Arthas
支持在Linux/Unix/Mac
等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲回车
执行即可:
1curl -L https://alibaba.github.io/arthas/install.sh | sh
地址:Arthas
如果下载速度比较慢,可以尝试用阿里云的镜像仓库,比如要下载3.x.x版本(替换3.x.x为最新版本),下载的url是:
1https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.x.x/arthas-packaging-3.x.x-bin.zip
1unzip arthas-packaging-bin.zip
安装之前最好把所有老版本的Arthas全都删掉
1su admin
2rm -rf /home/admin/.arthas/lib/*
3cd arthas
4./install-local.sh
注意,这里根据你需要诊断的Java进程的所属用户进行切换(arthas无法跨用户进行监听,即便使用root账户也无法监听其他账户启动的java进程)
启动之前,请确保老版本的Arthas已经shutdown.
1~/.arthas/lib/3.1.0/arthas/as.sh
显示进程信息,包含部分线程信息,内存信息,gc信息,部分系统信息,如果是tomcat还会显示tomcat的实时信息.该界面会一直刷新数据按CTRL+C
中断.
默认刷新速率是每5秒刷新一次.
常用参数:
1dashboard [-b] [-h] [-i <value>] [-n <value>]
2
3-n <value> 获取几次的数据
4-i <value> 刷新间隔,单位为毫秒
显示线程状态,什么参数都不使用会打印所有线程的大致信息
常用参数:
1thread [-h] [-b] [-i <value>] [-n <value>] [id]
2
3-b 查找处于block状态的线程
4-i <value> 根据value的时间(单位为毫秒)统计线程的cpu使用情况,给出线程cpu利用率
5-n <value> 查看cpu占用率为前value的线程的堆栈信息
6<id> 显示该线程id的线程的堆栈信息
打印jvm的详细信息
打印jvm虚拟机系统属性
常用参数:
1sysprop [-h] [property-name] [property-value]
2
3<property-name> 显示具体的某个属性,可以使用tab进行补全
4<property-name> <property-value> 修改属性值
打印系统环境变量
常用参数:
1sysenv [-h] [env-name]
2
3<env-name> 显示具体的某个变量,可以使用tab进行补全
查看java虚拟机JMX数据Mbean,不加参数时显示全部mbean列表
常用参数:
1mbean [-h] [-i <value>] [-m] [-n <value>] [-E] [name-pattern] [attribute-pattern]
2
3-i <value> 按照value(单位为毫秒)周期刷新显示
4-m 显示详细的原始数据,在指定name-pattern的情况下有效
5-n <value> 显示value次的数据
6-E 匹配规则按照正则表达式匹配
7[name-pattern] mbean的objectName的匹配规则,支持*通配符
8[attribute-pattern] mbean的属性的匹配规则,支持*通配符,没有情况下显示全部信息
查看静态常量信息,功能较为简单,官方建议如果由复杂的查询需要使用ognl进行查询
常用参数:
1getstatic [-c <value>] [-x <value>] [-h] [-E] class-pattern field-pattern [express]
2
3-c <value> 通过classloader的hashCode指定classloader
4-x <value> 对象参数展开级别,默认为1,即只显示该对象的属性,不会显示对象属性的属性
5-E 匹配规则改为正则表达式匹配
6class-pattern 类规则,支持*通配符
7field-pattern 属性规则,支持*通配符
8express 具体内容过滤,使用ognl编写表达式
查看所有已经加载的类
常用参数:
1sc [-d] [-x <value>] [-f] [-h] [-E] class-pattern
2
3-d 显示类信息
4-x <value> 对象参数展开级别,默认为0,即不展开
5-f 显示属性,需要和-d一起使用
6-E 匹配规则改为正则表达式匹配
7class-pattern 类规则,支持*通配符
查看类的方法信息
常用参数:
1sm [-d] [-h] [-E] class-pattern [method-pattern]
2
3-d 显示方法的详细信息
4-E 匹配规则改为正则表达式匹配
5class-pattern 类规则,支持*通配符
6[method-pattern] 方法规则,支持*通配符
从虚拟机中将类的class文件提取出来
常用参数:
1dump [-c <value>] [-d <value>] [-h] [-E] class-pattern
2
3-c <value> 通过classloader的hashCode指定classloader
4-d <value> 设置class文件输出目录
5-E 匹配规则改为正则表达式匹配
6class-pattern 类规则,支持*通配符
反编译指定已加载类的源码
常用参数:
1jad [-c <value>] [-h] [-E] [--source-only] class-pattern [method-name]
2
3-c <value> 通过classloader的hashCode指定classloader
4-E 匹配规则改为正则表达式匹配
5[--source-only] 反编译时会带上classloader信息,该选项将只显示源码
6class-pattern 类规则,支持*通配符
7[method-name] 方法规则,支持*通配符
显示classloader信息
常用参数:
1classloader [-a] [-c <value>] [-h] [-i] [-l] [--load <value>] [-r <value>] [-t]
2
3-a 显示全部被加载的类,数据量较大,谨慎使用
4-c <value> 根据classloader的hashCode显示classloader所属的jar包路径,配合其他参数时显示该classloader的内容
5-i 包含根加载器,测试没有发现差异
6-l 根据具体的classloader对象显示信息,而不是对于classloader类显示
7--load <value> 加载指定的类,需要和-c一起使用classloader
8-r <value> 加载指定的资源,需要和-c一起使用指定classloader
9-t 打印继承树
打印命令,和linux的cat一样效果
常用参数:
1cat [--encoding <value>] [-h] files...
2
3--encoding <value> 文件编码
4files... 文件列表
显示工作目录,和linux的pwd一样效果
工作目录为监控的程序的工作目录
执行ognl表达式
常用参数:
1ognl [-c <value>] [-x <value>] [-h] express
2
3-c <value> 通过classloader的hashCode指定classloader
4-x <value> 对象参数展开级别,默认为1
5express 表达式
ognl参考:
https://alibaba.github.io/arthas/ognl
https://commons.apache.org/proper/commons-ognl/language-guide.html
内存编译器,编译Java文件为字节码文件,编译存在失败的可能性,如果失败可以在本地进行编译,然后上传至服务器
常用参数:
1mc [-c <value>] [-d <value>] [--encoding <value>] [-h] sourcefiles...
2
3-c <value> 通过hashcode指定classloader进行编译
4-d <value> 字节码文件输出目录
5--encoding <value> 源代码文件编码
6sourcefiles... java文件列表
加载外部的class文件,替换掉虚拟机中的类,不停机进行替换测试
注意: 替换到的类无法进行恢复(只能重启恢复),并且如果原本的类和新的类存在差异(类结构层面的差异,比如增加了新的方法),将导致替换失败
常用参数:
1redefine [-c <value>] [-h] classfilePaths...
2
3-c 通过hashcode指定classloader加载
4classfilePaths... class文件列表
限制:
方法执行监控
常用参数:
1monitor [-c <value>] [-h] [-n <value>] [-E] class-pattern method-pattern
2
3-c <value> 监控周期,默认为一分钟
4-n <value> 记录次数,一周期为一次
5-E 匹配规则改为正则表达式匹配
6class-pattern 类规则,支持*通配符
7method-name 方法规则,支持*通配符
监控维度:
| 监控项 | 说明 |
| --------- | -------------------------- |
| timestamp | 时间戳 |
| class | Java类 |
| method | 方法(构造方法、普通方法) |
| total | 调用次数 |
| success | 成功次数 |
| fail | 失败次数 |
| rt | 平均RT |
| fail-rate | 失败率 |
方法执行出入参具体情况监控
常用参数:
1watch [-b] [-e] [-x <value>] [-f] [-h] [-n <value>] [-E] [-M <value>] [-s] class-pattern method-pattern express [condition-express]
2
3-b 在方法执行前进行观察
4-e 在发生异常后观察
5-x <value> 对象展开级别,默认为1
6-f 在方法结束(包含正常返回和异常返回)后进行观察(默认选项)
7-n <value> 监控次数
8-E 匹配规则改为正则表达式匹配
9-M 返回结果大小限制(默认为10*1024*1024)
10-s 在方法返回后进行观察
11class-pattern 类规则,支持*通配符
12method-name 方法规则,支持*通配符
13express 观察表达式,ognl表达式,能够观察执行的入参出餐
14[condition-express] 条件表达式,ognl表达式,符合表达式的显示
获取方法内部的调用路径,并输出方法路径上的每个节点上耗时
常用参数:
1trace [-h] [-j] [-n <value>] [-p <value>] [-E] class-pattern method-pattern [condition-express]
2
3-j 过滤掉jdk的函数
4-n <value> 统计次数
5-p <value> path tracing pattern
6-E 匹配规则改为正则表达式匹配
7class-pattern 类规则,支持*通配符
8method-name 方法规则,支持*通配符
9[condition-express] 条件表达式,ognl表达式,符合表达式的显示
输出方法的调用路径
常用参数:
1stack [-h] [-n <value>] [-E] class-pattern [method-pattern] [condition-express]
2
3-n <value> 统计次数
4-E 匹配规则改为正则表达式匹配
5class-pattern 类规则,支持*通配符
6[method-name] 方法规则,支持*通配符
7[condition-express] 条件表达式,ognl表达式,符合表达式的显示
TimeTunnel,方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
常用参数:
1tt [-d] [--delete-all] [-x <value>] [-h] [-i <value>] [-n <value>] [-l] [-p] [-E] [--replay-interval <value>] [--replay-times <value>] [-s <value>] [-M <value>] [-t] [-w <value>] [class-pattern] [method-pattern] [condition-express]
2
3-i <value> 指定记录
4-d 删除某个记录,使用-i指定记录
5--delete-all 删除所有记录
6-x <value> 对象展开级别
7-n <value> 调用次数,调用量过多的函数可能存在无法中断的情况,建议使用-n设定记录次数
8-l 显示所有记录
9-p 再次调用
10-E 匹配规则改为正则表达式匹配
11--replay-interval <value> 调用间隔
12--replay-times <value> 调用次数
13-s <value> 在记录中搜索,使用ognl表达式搜索
14-M <value> 返回结果大小限制
15-t 记录方法执行数据
16-w <value> 观察表达式,使用ognl
17[class-pattern] 类规则,支持*通配符
18[method-pattern] 方法规则,支持*通配符
19[condition-express] 条件表达式,ognl表达式,符合表达式的显示
支持使用|
进行管道连接,对结果进行进一步处理
支持命令
1grep——搜索满足条件的结果
2plaintext——将命令的结果去除ANSI颜色
3wc——按行统计输出结果
arthas
仿照linux设计了异步调用
使用&
将任务放到后台执行,这时console可以进行其他操作
使用命令jobs
查看后台运行的任务
例:
1$ jobs
2[33]*
3 Running tt -t com.zznode.ssg.dao.service.BusinessService heartBeatSend &
4 execution count : 2
5 start time : Mon Jul 29 15:03:37 CST 2019
6 timeout date : Tue Jul 30 15:03:37 CST 2019
7 session : efe3963e-0e2c-4786-b989-11d3694fa46e (current)
[33]*
33为任务id,*
号表示该任务由当前session创建
execution count
为调用次数
timeout date
是超时的时间,到这个时间,任务将会自动超时退出
任务在后台执行或者暂停状态(ctrl + z暂停任务)时,执行fg 将可以把对应的任务转到前台继续执行。在前台执行时,无法在console中执行其他命令
当任务处于暂停状态时(ctrl + z暂停任务),执行bg 将可以把对应的任务在后台继续执行
非当前session创建的job,只能由当前session fg到前台执行
使用>
和>>
将输出结果重定向
可以使用kill <jobs-id>
停止任务
注意:
quit将退出会话,异步任务将继续执行
quit退出后想要再次进入可以执行telnet 127.0.0.1 3658
shutdown将退出arthas