文章目录
- 一、简介
- 1、简介
- 2、项目所在位置
- 二、安装Arthas
- 1、安装Arthas
- 2、卸载Arthas
- 3、首次启动。
- 三、核心监视功能
- 1、`monitor`:监控方法的执行情况
- 2、`watch`:检测函数返回值
- 3、`trace`:根据路径追踪,并记录消耗时间
- 4、`stack`:输出当前方法被调用的调用路径
- 5、`tt`:时间隧道,记录多个请求
- 5.1 `tt`对重载的支持
- 5.2 `tt`发起重新请求
- 四、项目中使用
- 9.1 `trace`:查询最耗时应用
- 9.2 `jad`:反编译耗时代码
- 9.3 `trace`:查询最耗时应用
- 9.4 `watch`:捕获耗时应用入参、返回值
- 五、基础命令
- 1、`help`:显示`Arthas`命令介绍
- 2、`cat`:显示文件下,文本内容
- 3、`grep`: 管道命令
- 4、`pwd`:打印当前的工作目录
- 5、`session`:查看当前会话的信息
- 6、`reset`:重置增强后类
- 7、`version`:查看当前`Arthas`版本
- 8、`history`:查看历史命令
- 9、`quit`:退出`Arthas`客户端
- 10、`stop`:关闭 Arthas 服务端
- 11、`keymap`:查看`Arthas`快捷键
- 六、Jvm相关命令
- 1、`dashboard`:实时数据面板
- 2、`Thread`:线程相关堆栈信息
- 3、`jvm`
- 4、`sysprop`:查看/修改属性
- 5、`sysenv`:查看JVM环境属性
- 6、`vmpotion`:查看JVM中选项
- 7、`getstatic`:获取静态成员变量
- 8、`ognl`:执行ognl表达式
- 七、类和类加载器(class/classLoader)
- 1、`sc`:查看类信息
- 2、`sm`:查看已加载方法信息
- 3、编译与反编译`jad`、`mc`、`redefine`
- 3.1 `jad`:反编译已加载类源码
- 3.2 `mc`:编译Java代码
- 3.3 `redefine`:加载外部`.class`文件
- 4、`dump`:保存已加载字节码文件到本地
- 5、`classloader`:获取类加载器的信息
- 八、`option`全局选项
- 九、`profiler`火焰图
- 十、相关文件
- 1、配套资料
- 2、Xmind整理资料
一、简介
1、简介
GitHub地址
https://github.com/alibaba/arthas
码云地址
http://arthas.gitee.io/
Arthas
是Alibaba
开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时, Arthas 可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的
Exception
? - 我改的代码为什么没有执行到?难道是我没
commit
?分支搞错了? - 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到
JVM
的实时运行状态? - 怎么快速定位应用的热点,生成火焰图?
Arthas
支持JDK 6+,支持Linux/Mac/Winodws
,采用命令行交互模式,同时提供丰富的 Tab 自动补
全功能,进一步方便进行问题的定位和诊断。
2、项目所在位置
所在目录 | 命令 | 说明 |
---|---|---|
dump | 将已加载类的字节码文件保存到特定的目录中 | |
classloader | 获取类加载器的信息 | |
monitor | 监控指定类中方法的执行情况 | |
watch | 观察到指定方法的调用情况 | |
trace | 对方法内部调用路径进行追踪,并输出方法路径上每个节点上耗时 | |
stack | 输出当前方法被调用的路径 | |
tt | 记录指定方法每次调用的入参和返回信息 | |
options | 全局开关 | |
profiler | 生成火焰图 |
二、安装Arthas
1、安装Arthas
- 下载
arthas-boot.jar
wget https://arthas.aliyun.com/arthas-boot.jar;
java -jar arthas-boot.jar
选择进程
1
2、卸载Arthas
因为文件是绿色版本,直接删除安装目录既可
rm -rf ./arthas # 隐藏目录
rm -rf logs/ # 日志目录
3、首次启动。
首先要启动jar包,然后才能启动Arthas。
三、核心监视功能
1、monitor
:监控方法的执行情况
监控指定类中方法的执行情况
用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息
参数说明
方法拥有一个命名参数 [c:]
,意思是统计周期(cycle of output),拥有一个整型的参数值
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[c:] | 统计周期,默认值为120秒 |
监控demo.MathGame
类,并且每5S更新一次状态。
monitor demo.MathGame primeFactors -c 5
监控的维度说明
监控项 | 说明 |
---|---|
timestamp | 时间戳 |
class | Java类 |
method | 方法(构造方法、普通方法) |
total | 调用次数 |
success | 成功次数 |
fail | 失败次数 |
rt | 平均耗时 |
fail-rate | 失败率 |
2、watch
:检测函数返回值
方法执行数据观测,让你能方便的观察到指定方法的调用情况。
能观察到的范围为:
返回值
、抛出异常
、入参
,通过编写OGNL 表达式进行对应变量的查看。
参数说明:
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
express | 观察表达式 |
condition-express | 条件表达式 |
[b] | 在方法调用之前观察before |
[e] | 在方法异常之后观察 exception |
[s] | 在方法返回之后观察 success |
[f] | 在方法结束之后(正常返回和异常返回)观察 finish |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[x:] | 指定输出结果的属性遍历深度,默认为 1 |
这里重点要说明的是观察表达式,观察表达式的构成主要由ognl 表达式组成,所以你可以这样写"{params,returnObj}"
,只要是一个合法的 ognl 表达式,都能被正常支持。
特别说明
- watch 命令定义了4个观察事件点,即
-b
方法调用前,-e
方法异常后,-s
方法返回后,-f
方法结束后 - 4个观察事件点
-b
、-e
、-s
默认关闭,-f
默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出 - 这里要注意
方法入参
和方法出参
的区别,有可能在中间被修改导致前后不一致,除了-b
事件点params
代表方法入参外,其余事件都代表方法出参 - 当使用
-b
时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
通过watch
命令可以查看函数的参数/返回值/异常信息。
案例:
# 查看方法执行的返回值
watch demo.MathGame primeFactors returnObj
# 观察demo.MathGame类中primeFactors方法出参和返回值,结果属性遍历深度为2。
# params:表示所有参数数组(因为不确定是几个参数)。
# returnObject:表示返回值
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
查看执行前参数:
# -b 方法执行前的参数
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
# 查看方法中的属性
watch demo.MathGame primeFactors "{target}" -x 2 -b
查看某一属性的值
watch demo.MathGame primeFactors "{target.illegalArgumentCount}" -x 2 -b
检测方法在执行前-b
、执行后-s
的入参params
、属性target
和返回值returnObj
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
输入参数小于0的情况:
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
3、trace
:根据路径追踪,并记录消耗时间
对方法内部调用路径进行追踪,并输出方法路径上的每个节点上耗时。
简介:
trace
命令能主动搜索class-pattern
/method-pattern
对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。观察表达式的构成主要由ognl 表达式组成,所以你可以这样写
"{params,returnObj}"
,只要是一个合法的 ognl 表达式,都能被正常支持。很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如
trace *StringUtils isBlank '#cost>100'
表示当执行时间超过100ms的时候,才会输出trace的结果。watch/stack/trace这个三个命令都支持
#cost
耗时条件过滤。
参数说明:
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达匹配 |
method-pattern | 方法名表达式匹配 |
condition-express | 条件表达式,使用OGNL表达式 |
[E] | 开启正则表达式匹配,默认是通配符匹配 |
[n:] | 设置命令执行次数 |
#cost | 方法执行耗时,单位是毫秒 |
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
condition-express | 条件表达式 |
#cost | 过滤条件,只追踪满足的耗时方法 |
案例:
# trace函数指定类的指定方法
trace demo.MathGame run
文章出处登录后可见!