arthas Can not find tools.jar 使用报错
原因是没有安装完整的jdk,当然重新安装jdk应该也是可以的,
另一种方案是,下载一个完整的jdk8,解压到当前目录的 jdk8,使用命令 ./jdk8/bin/java -jar arthas-boot.jar 2404
就可以了
启动:
java -jar arthas-boot.jar [PID]
sc 和 sm
- 通过sc可以查看已加载类的相关信息,比如该类是从哪个jar包加载的,被哪个类加载器加载的,以及是否是接口等等。
- sm查看已加载类的方法详情。
监控方法:
watch
- 让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
- watch的使用姿势比较丰富,可以在四个不同的场景观察方法的执行。比如方法调用之前、方法调用之后、方法异常之后、方法结束之后。默认观察的是方法结束之后。
- 如果观察的是方法结束之后的场景,由于入参可能在执行方法时被改变,所以此时输出的可能不是真正的入参。因此,要看真正的入参,要看方法调用之前的,也就是加上-b的参数。
- 另外,使用-b参数观察的话,则观察不到方法返回的结果以及抛出的异常了。
参数名称 参数说明 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 express 观察表达式 condition-express 条件表达式 [b] 在方法调用之前观察 [e] 在方法异常之后观察 [s] 在方法返回之后观察 [f] 在方法结束之后(正常返回和异常返回)观察 [E] 开启正则表达式匹配,默认为通配符匹配 [x:] 指定输出结果的属性遍历深度,默认为 1 [n:] 只执行n次,默认会不断输出,除非用户按下cltr+c
# 观察CommonTest的test方法 # 输出 入参、返回结果、抛出的异常 —— 输出的内容可以动态调整 # 后面跟着的是 条件表达式,表示耗时超过10ms才输出 # -n 表示只执行一次,-x表示 入参和返回结果的展开层次为5层 watch *.CommonTest test "{params,returnObj,throwExp}" '#cost>10' -x 5 -n 1 # 耗时大于10ms并且第一个参数等于1才输出 watch *.CommonTest test "{params,returnObj,throwExp}" '#cost>10 && params[0]==1' -x 5 -n 1 # 第一个参数大于1 并且第二个参数等于hello才输出 watch *.CommonTest test "{params,returnObj,throwExp}" 'params[0]>1 && params[1]=="hello"' -x 5 -n 1 # 第一个参数小于5或者第二个参数等于"world"就输出 watch *.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