Arthas(Java诊断工具)
官方文档:https://arthas.aliyun.com/doc/quick-start.html#demo
一、快速开始
watch(方法执行数据观测) watch 类全路径 方法名 returnObj 观察方法返回结果 watch demo.MathGame primeFactors "{params,returnObj}" -x 2 观察方法出参和返回值, -x 2为打印结果深度,默认为1; watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" 观察第一个参数params[0]<0时的实例 watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' 观察耗时大于200ms的情况 watch demo.MathGame primeFactors 'target.illegalArgumentCount' 观察当前对象的某个属性,target是关键字,不能替换,target后边的是类中的属性值 watch demo.MathGame * '{params,@demo.MathGame@random.nextInt(100)}' -v -n 1 -x 2 获取类的静态字段、调用类的静态方法
其他参数还有:
-b 在方法执行前 -e 方法异常后 -s 方法返回后 -f 在方法结束之后(正常返回和异常返回)观察,默认开启 -v 打印更多信息
"{params,returnObj}"是观察表达式,可选的参数有:
loader 本次调用类所在的 ClassLoader clazz 本次调用类的 Class 引用 method 本次调用方法反射引用 target 本次调用类的实例 params 本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组 returnObj 本次调用返回的对象。当且仅当 isReturn==true 成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值 void,则值为 null throwExp 本次调用抛出的异常。当且仅当 isThrow==true 成立时有效,表明方法调用是以抛出异常的方式结束。 isBefore 辅助判断标记,当前的通知节点有可能是在方法一开始就通知,此时 isBefore==true 成立,同时 isThrow==false 和 isReturn==false,因为在方法刚开始时,还无法确定方法调用将会如何结束。 isThrow 辅助判断标记,当前的方法调用以抛异常的形式结束。 isReturn 辅助判断标记,当前的方法调用以正常返回的形式结束。
二、命令参考
monitor 方法执行监控,数据统计用 watch 方法执行数据观测 trace 方法内部调用路径,并输出方法路径上的每个节点上耗时 stack 输出当前方法被调用的调用路径 tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 help 查看所有命令 dashboard 展示当前进程的信息 thread 1 获取线程信息,1通常是main函数 jad 类全路径 反编译类
基础命令
help 查看命令帮助信息
cat 打印文件内容,和linux里的cat命令类似
echo 打印参数,和linux里的echo命令类似
grep 匹配查找,和linux里的grep命令类似
base64 base64编码转换,和linux里的base64命令类似
tee 复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
pwd 返回当前的工作目录,和linux命令类似
cls 清空当前屏幕区域
session 查看当前会话的信息
reset 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version 输出当前目标 Java 进程所加载的 Arthas 版本号
history 打印命令历史
quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap Arthas快捷键列表及自定义快捷键
options 查看或设置Arthas全局开关
class/classloader相关
sc 查看JVM已加载的类信息,参数*则为所有,可以有前缀 sm 查看已加载类的方法信息 mc 内存编译器,内存编译.java文件为.class文件 retransform 加载外部的.class文件,retransform到JVM里 redefine 加载外部的.class文件,redefine到JVM里 dump dump 已加载类的 byte code 到特定目录 classloader 查看classloader的继承树,urls,类加载信息,使用classloader去getResource
jvm相关
dashboard 当前系统的实时数据面板
thread 查看当前 JVM 的线程堆栈信息
jvm 查看当前 JVM 的信息
sysprop 查看和修改JVM的系统属性
sysenv 查看JVM的环境变量
vmoption 查看和修改JVM里诊断相关的option
perfcounter 查看当前 JVM 的Perf Counter信息
logger 查看和修改logger
getstatic 查看类的静态属性
ognl 执行ognl表达式
mbean 查看 Mbean 的信息
heapdump dump java heap, 类似jmap命令的heap dump功能