1. 是什么
官方文档:https://arthas.aliyun.com/doc/
Arthas是Alibaba开源的Java诊断工具
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
2. 安装(包含离线安装)
https://www.cnblogs.com/shihaiming/p/12945700.html
安装arthas idea插件
3. 使用
3.1. 启动arthas
- 运行 arthas-boot.jar,会将 java 程序列举出来
- 选择需要进入的进程,只需要输入进程前面的数字并回车(以 1 为例)
3.2. 常用命令
IDEA获取命令方式:
- 右键需要操作的方法
- 选择 Arthas Command
- 选择对应的操作
3.2.1. dashboard
展示当前进程的信息
- ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应。
- NAME: 线程名
- GROUP: 线程组名
- PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
- STATE: 线程的状态
- CPU%: 线程的cpu使用率。比如采样间隔1000ms,某个线程的增量cpu时间为100ms,则cpu使用率=100/1000=10%
- DELTA_TIME: 上次采样之后线程运行增量CPU时间,数据格式为
秒
- TIME: 线程运行总CPU时间,数据格式为
分:秒
- INTERRUPTED: 线程当前的中断位状态
- DAEMON: 是否是daemon线程
3.2.2. jad
反编译 class
3.2.3. monitor
方法执行监控
- timestamp:时间戳
- class:Java类
- method:方法(构造方法、普通方法)
- total:调用次数
- success:成功次数
- fail:失败次数
- rt:平均RT
- fail-rate:失败率
3.2.4. watch
观察指定函数的调用情况。能观察到的范围为:返回值
、抛出异常
、入参
3.2.5. trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
3.2.6. stack
输出当前方法被调用的调用路径:当一个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令
3.2.7. tt
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
1、记录下当前方法的每次调用环境现场
- INDEX:时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。
- TIMESTAMP:方法执行的本机时间,记录了这个时间片段所发生的本机时间
- COST(ms:方法执行的耗时
- IS-RET:方法是否以正常返回的形式结束
- IS-EXP:方法是否以抛异常的形式结束
- OBJECT 执行对象的hashCode():,注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
- CLASS:执行的类名
- METHOD:执行的方法名
2、查看调用信息:对于具体一个时间片的信息而言,你可以通过 -i
参数后边跟着对应的 INDEX
编号查看到他的详细信息