官方文档

https://arthas.aliyun.com/doc/

安装

入门

运行

选择 java 进程序号,回车

以下是基础命令

  • 查看当前进程信息: dashboard
  • 打印线程的栈:thread 线程 id
  • 查找 main.class:thread 线程 id | grep ‘main(‘
  • 查找 jvm 加载的类: sc -d *类名
  • 反编译类:jad 类(sc -d *类名命令展示的 class-info)
  • 查看函数的参数 / 返回值 / 异常信息:watch 类 primeFactors returnObj
  • 退出: quit 或者 exit, 完全退出用 stop

进阶

  • 查看函数返回值:watch 类 方法名 returnObj -x 2 ,-x 后面带的数字表示返回值的深度, 自己执行体验下就知道了
  • 查看函数传参:watch 类 方法名 params[0] param[0] 中括号里 0,1 表示第几个参数
  • 方法内部调用路径,并输出方法路径上的每个节点上耗时: trace 类 方法

实践

栗子 1:发现线上有 bug, 怀疑是代码没更新,或者传参有问题。

操作:

  1. 反编译代码,看看代码是不是最新的
    jad com.study.demo.service.impl.DemoServiceImpl

  2. 打印传参
    watch com.study.demo.service.impl.DemoServiceImpl testArthas params
    arthas学习笔记 - 匪思匪存 - 图1

  3. 查看返回值
    watch com.study.demo.service.impl.DemoServiceImpl testArthas returnObj -x 1
    arthas学习笔记 - 匪思匪存 - 图2

栗子 2:发现接口响应过慢
trace com.study.demo.controller.DemoController test
arthas学习笔记 - 匪思匪存 - 图3

栗子 3: 发现调用外部接口这部分处理逻辑影响导致线上问题, 想打印传参以及返回值
watch com.study.demo.service.impl.DemoServiceImpl testArthas “{params,returnObj}” “#cost>200” -x 2
解释:查看传参跟返回值,以及方法耗时大于 200ms 的
https://tungchi.cn/2021/04/23/?p=71