上文中我们介绍arthas一些基本命令的使用,可以通过那些命令完成一些像反编译、追踪class,查看类方法等,本文将详细介绍类和类加载器有关的命令。
保存的默认路径为:~/logs/arthas/classdump/;不同的类加载器放在不同的目录下。
# 把String类的字节码文件保存到~/logs/arthas/classdump/目录下
dump java.lang.String
# 把demo包下所有的类的字节码文件保存到~/logs/arthas/classdump/目录下
dump demo.*
classloader命令将 JVM 中所有的classloader的信息统计出来。具体使用参数如下:
参数名称 | 参数说明 |
---|---|
[l] | 按类加载实例进行统计 |
[t] | 打印所有ClassLoader的继承树 |
[a] | 列出所有ClassLoader加载的类,请谨慎使用 |
[c:] |
ClassLoader的hashcode |
[c: r:] |
用ClassLoader去查找resource |
[c: load:] |
用ClassLoader去加载指定的类 |
# 1、默认按类加载器的类型查看统计信息
classloader
# 2、按类加载器的实例查看统计信息,可以看到类加载的hashCode
classloader -l
# 3、查看ClassLoader的继承关系
classloader -t
# 4、通过类加载器的hash,查看此类加载器实际所在的位置
classloader -c 28bb0d54
# 5、使用ClassLoader去查找类的class文件所在的位置
classloader -c 28bb0d54 -r java/lang/String.class
# 6、使用ClassLoader去加载类
classloader -c 70dea4e --load java.lang.String
用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息。
# 过5秒监控一次,类demo.MathGame中primeFactors方法(c参数默认是120秒)
monitor -c 5 demo.MathGame primeFactors
监控参数 | 说明 |
---|---|
timestamp | 时间戳 |
class | Java类 |
method | 方法(构造方法、普通方法) |
total | 调用次数 |
success | 成功次数 |
fail | 失败次数 |
rt | 平均耗时 |
fail-rate | 失败率 |
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
express | 观察表达式 |
condition-express | 条件表达式 |
[b] | 在方法调用之前观察 before,默认关闭 |
[e] | 在方法异常之后观察 exception,默认关闭 |
[s] | 在方法返回之后观察 success,默认关闭 |
[f] | 在方法结束之后(正常返回和异常返回)观察 finish,默认打开 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[x:] | 指定输出结果的属性遍历深度,默认为 1 |
# 1、观察demo.MathGame类中primeFactors方法出参和返回值,结果属性遍历深度为2。params表示所有参数数组,returnObject表示返回值
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
# 2、观察方法入参,对比1,返回值为空(事件点为方法执行前,因此获取不到返回值)
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
# 3、观察当前对象中的属性,如果想查看方法运行前后,当前对象中的属性,使用target关键字,代表当前对象
watch demo.MathGame primeFactors 'target' -x 2
# 4、同时观察方法调用前和方法返回后,参数里-n 2,表示只执行两次。输出结果中,第一次输出是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果params表示参数,target表示执行方法的对象,returnObject表示返回值
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
对方法内部调用路径进行追踪,并输出方法路径上的每个节点上耗时。
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达匹配 |
method-pattern | 方法名表达式匹配 |
[E] | 开启正则表达式匹配,默认是通配符匹配 |
[n:] |
设置命令执行次数 |
#cost |
方法执行耗时,单位是毫秒 |
# 1、trace 追踪指定类的指定方法
trace demo.MathGame run
# 2、如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数
trace demo.MathGame run -n 1
# 3、默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置--skipJDKMethod false
trace --skipJDKMethod false demo.MathGame run
# 4、根据调用耗时过滤,trace大于0.5ms的调用路径
trace demo.MathGame run '#cost > .5'
# 1、获取primeFactors的调用路径
stack demo.MathGame primeFactors
# 2、条件表达式来过滤,第0个参数的值小于0,-n表示获取2次
stack demo.MathGame primeFactors 'params[0]<0' -n 2
# 3、根据执行时间来过滤,耗时大于0.5毫秒
stack demo.MathGame primeFactors '#cost>0.5'
所有选项:options
# 1、获取options值
options dump
# 2、修改options值
options dump true
# 1、启动
profiler start
# 2、关闭 (默认情况下,生成的结果保存到应用的工作目录下的 arthas-output目录。可以通过 --file参数来指定输出结果路径)
profiler stop
profiler stop --file /tmp/output.svg
profiler stop --format html # 生成html
# 3、查看状态
profiler status
# 4、查看热力图
http://localhost:3658/arthas-output/
注:
y 轴表示调用栈,每一层都是一个函数。调用栈越深,热力就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
热力图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。颜色没有特殊含义,因为热力图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
本人是一个从小白自学计算机技术,对前端、运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)