Arthas技巧

基础命令

  • dashboard
    • -i 实时数据的时间间隔,默认5000ms,
    • -n 刷新实时数据的次数
      1
      dashboard -i 5000 -n 20
  • thread
    • -n 指定最忙的前N个线程并打印堆栈
    • -b 找出当前线程阻塞其他线程的线程
1
2
3
thread -n 3
thread -b
thread 51
  • jvm(查看jvm参数)

  • sysprop(当前jvm的系统属性)

  • sysenv(当前jvm的环境属性)

  • vmoption(查看,更新jvm诊断相关的参数)

  • perfcounter(查看当前jvm的Perf Counter信息)

  • logger(查看该进程下的logger相关信息)

    • 更新日志级别
      1
      logger -n kl --level debug
  • mbean

  • getstatic(查看类的静态属性,支持ognl表达式)

  • ognl(https://commons.apache.org/proper/commons-ognl/language-guide.html)

    1
    2
    3
    4
    5
    ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
    @ArrayList[
    @String[/opt/java/8.0.181-zulu/jre],
    @String[OpenJDK Runtime Environment],
    ]
  • sc(查看已加载的类信息)

    • -d 输出当前类的详细信息
    • -f 输出当前类的成员变量信息
1
sc -d -f kl.cdsm2.web.MainApp
  • sm(查看已加载类的方法信息)
    • -d 展示每个方法的详细信息
1
sm -d kl.cdsm2.web.MainApp [init]
1
vmtool --action getInstances --className kl.cdsm2.config.ApiServiceCfg -x 3
  • jad(反编译指定已加载类的源码)

  • classloader(查看类加载信息)

    • –load 使用类加载去加载类信息
    • -t 查看继承树
    • -c 查看URLClassloader实际的urls
  • mc (编译.java 文件生成.class)

  • retransform/redefine(加载外部的.class文件,retransform/redefine jvm已加载的类)

    • 不允许新增加field/method
    • 正在跑的函数,没有退出不能生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
结合 jad/mc 命令使用
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

mc /tmp/UserController.java -d /tmp

retransform /tmp/com/example/demo/arthas/user/UserController.class

使用mc命令来编译jad的反编译的代码有可能失败。可以在本地修改代码,编译好后再上传到服务器上。有的服务器不允许直接上传文件,可以使用base64命令来绕过。

在本地先转换.class文件为base64,再保存为result.txt

base64 < Test.class > result.txt
到服务器上,新建并编辑result.txt,复制本地的内容,粘贴再保存

把服务器上的 result.txt还原为.class

base64 -d < result.txt > Test.class
用md5命令计算哈希值,校验是否一致
  • monitor(方法执行监控)

    • -c 统计周期,默认值为120秒
  • watch(函数执行数据观测)

    • -b 函数调用之前观察
    • -f 函数调用之后观察
    • -s 函数返回之后观察
    • -e 函数异常之后观察
    • -x 函数深度
  • trace(方法内部调用路径,并输出方法路径上的每个节点上耗时)渲染和统计整个调用链路上的所有性能开销和追踪调用链路

    • -n 次数
    • –skipJDKMethod false default true
    • ‘#cost > 10’展示耗时大于10ms的调用路径,有利于排查问题
1
2
trace kl.cdsm2.service.apisvr.biz.cert.CertIssueApplyHandler handleBiz
trace kl.cdsm2.service.apisvr.biz.cert.CertIssueApplyHandler handleBiz '#cost>10'
  • stack(输出当前方法被调用的调用路径),使用方法通trace
  • tt(方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调进行观测,timetunnel)
    • -t 记录方法每次的指定情况
    • -n 3 当你执行一个调用量不高的方法可能你还能有足够的时间用ctrl C 中断,如果遇到调用量非常大的方法,瞬间就把你的JVM内存撑爆。
    • -l 查看时空隧道,检索调用记录
    • -i index 编号 查看详细信息
    • -p 重做一次调用
1
2
3
4
tt -t kl.cdsm2.service.apisvr.biz.cert.CertIssueApplyHandler handleBiz
tt -l
tt -s 'method.name=="handleBiz"'
tt -i 1000 -p
  • profiler 支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集的采样结果生成火焰图
1
2
3
profiler start
profiler status
profiler stop --format html
  • base64
  • tee
  • auth

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!