arthas使用指北

发布时间 2023-11-16 11:39:21作者: 一只小白的进修路

备忘录

一. arthas的使用

常用命令

  1. jad

    • 反编译class类、方法

    • 语法

      jad -c 类加载器 类的全路径 方法名
      
  2. thread

    • 操作线程

    • 语法

      `列举全部的线程`
      thread    
      
      `按照CPU使用率列举前5个线程`
      thread -n 5
      
      `根据id查看此线程处于的运行状态,在执行的具体某个方法,方法中的代码行号`
      thread id
      
      `根据关键字查找线程`
      thread|grep 关键字
      
  3. ognl

    • 灵活的表达式

    • 语法

      `输出内部类里面的静态变量`
      `-x 2 表示对象二级展开`
      ognl "@类名$内部类名@静态变量名" -x 2 
      
      `执行类中的静态方法,传递参数`
      ognl "@类名@静态方法(参数)"
      
      `查看集合(list/map)中的元素,  index指list下标, 'key'指map中的key`
      ognl "@类名@静态变量[index]" 
      ognl "@类名@静态变量['key']"
      
      `使用变量接收list、map、对象、方法的返回值。并输出`
      ognl "#value1={10,5,8},#value1"
      ognl "#value2=#{'key1':10, 'key2': 5},#value2"
      ognl "#value3 = new java.util.Random(10),#value3"
      ognl "#value4 = new java.util.Random().nextInt(100),#value4"
      
      `#this 永远表示当前的对象`
      ognl "{1,2}.size().(#this > 1 ? #this : 0)"  `输出2,#this表示list的size`
      
  4. sc、sm

    • 查看JVM已经加载的类和方法

    • 语法

      `-d 表示输出详细`
      sc 类的全路径名 -d
      
      sm 类的全路径名 方法名 -d  
      
  5. dump

    • 保存已加载字节码文件到本地

    • 语法

      `把demo包下所有的类的字节码文件保存到~/logs/arthas/classdump/目录下`
      dump demo.*
      
  6. mc、redefine

    • mc 编译java代码为.class文件

    • redefine 加载外部.class文件

    • 语法

      `编译MathGame文件`
      mc /root/MathGame.java -d /root
      `把编译后的MathGame文件加载到JVM`
      redefine /root/MathGame.class
      
  7. monitor

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

    • 语法

      `监视monitor方法,5s更新一次`
      monitor 类的全路径名 方法名 -c 5
      
      监控项 说明
      timestamp 时间戳
      class Java类
      method 方法(构造方法、普通方法)
      total 调用次数
      success 成功次数
      fail 失败次数
      rt 平均耗时
      fail-rate 失败率
  8. watch

    • 观察指定方法的调用情况

    • 语法

      参数名称 参数说明
      class-pattern 类名表达式匹配
      method-pattern 方法名表达式匹配
      express 观察表达式
      condition-express 条件表达式
      [b] 方法调用之前观察before
      [e] 方法异常之后观察 exception
      [s] 方法返回之后观察 success
      [f] 方法结束之后(正常返回和异常返回)观察 finish
      [E] 开启正则表达式匹配,默认为通配符匹配
      [x:] 指定输出结果的属性遍历深度,默认为 1
      `params表示入参,target表示类中的属性,retuernObj表示出参, 为固定格式,命名也是固定的。可选`
      `-x 2 表示展开2层`
      watch 类的全路径名 方法名 "{params,target,returnObj}" -x 2 -b -s
      
  9. trace

    • 对方法内部调用路径进行追踪,并输出方法路径上的每个节点上耗时。

    • 语法

      `追踪5次结束`
      `#cost > .5 表示时间大于0.5ms的记录, ognl表达式`
      `-E 开启正则匹配,默认是通配符匹配(不适用-E也可以使用 * 去匹配)`
      trace -E 类的全路径名1|类的全路径名2 方法名A|方法名B -n 5 '#cost > .5'
      
      `简易版`
      trace 类的全路径名 方法名
      
  10. stack

    • 输出当前方法被调用的调用路径

    • 语法

      `stack 类的全路径名 方法名 ognl表达式 -n 表示获取的次数, 支持-E使用正则匹配类名方法名`
      stack -E 类的全路径名1|类的全路径名2 方法名A|方法名B 'params[0]<0' -n 2
      
      `简易版`
      stack 类的全路径名 方法名