Arthas常用的命令(三)--monitor、jad 、stack

发布时间 2023-06-23 13:55:49作者: 乐之者v

monitor:监控方法的执行情况

监控指定类中方法的执行情况
用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息

  • 参数说明

方法拥有一个命名参数 [c:],意思是统计周期(cycle of output),拥有一个整型的参数值

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
-E 开启正则表达式匹配,默认为通配符匹配
-c 统计周期,默认值为120秒
  • 示例: 监控demo.MathGame类,并且每5S更新一次状态。
monitor *.MathGame primeFactors -c 5

执行结果如下:

  • 结果说明 :
监控项 说明
timestamp 时间戳
class Java类
method 方法(构造方法、普通方法)
total 调用次数
success 成功次数
fail 失败次数
rt 平均耗时
fail-rate 失败率

jad 反编译

  • jad 反编译代码:
jad 包的路径.类名 方法名

如果不确定包的路径,也可以用 *. 匹配,比如 Demo类,就是 *.Demo。

示例如下:

jad *.MathGame primeFactors

结果如下:

可以看到反编译后的代码。

[arthas@18228]$ jad *.MathGame primeFactors

ClassLoader:
+-sun.misc.Launcher$AppClassLoader@1909752
  +-sun.misc.Launcher$ExtClassLoader@a14482

Location:
/D:/arthas/math-game.jar

       public List<Integer> primeFactors(int number) {
/*44*/     if (number < 2) {
/*45*/         ++this.illegalArgumentCount;
               throw new IllegalArgumentException("number is: " + number + ", need >= 2");
           }
           ArrayList<Integer> result = new ArrayList<Integer>();
/*50*/     int i = 2;
/*51*/     while (i <= number) {
/*52*/         if (number % i == 0) {
/*53*/             result.add(i);
/*54*/             number /= i;
/*55*/             i = 2;
                   continue;
               }
/*57*/         ++i;
           }
/*61*/     return result;
       }

Affect(row-cnt:1) cost in 103 ms.

stack 参数说明

作用:输出当前方法被调用的调用路径。

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
condition-express 条件表达式
-E 开启正则表达式匹配,默认为通配符匹配
-n 执行次数限制
-m 指定 Class 最大匹配数量,默认值为 50。
  • stack查看调用路径:
[arthas@19440]$ stack *.MathGame primeFactors
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 63 ms, listenerId: 25
ts=2023-06-09 22:57:47;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@1909752
    @demo.MathGame.primeFactors()
        at demo.MathGame.run(MathGame.java:24)
        at demo.MathGame.main(null:-1)
  • 根据执行时间来过滤:
[arthas@19440]$ stack demo.MathGame primeFactors '#cost>0.5'
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 29 ms, listenerId: 29
ts=2023-06-09 23:06:37;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@1909752
    @demo.MathGame.primeFactors()
        at demo.MathGame.run(MathGame.java:24)
        at demo.MathGame.main(null:-1)

参考资料:

https://blog.csdn.net/lydms/article/details/125238249