Arthas
程序员文章站
2022-07-15 15:38:31
...
安装
- 使用arthas-boot(推荐)
下载arthas-boot.jar,然后用java -jar的方式启动:
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
- 使用as.sh
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装:
curl -L https://alibaba.github.io/arthas/install.sh | sh
上述命令会下载启动脚本文件 as.sh 到当前目录,直接在shell下面执行./as.sh,就会进入交互界面。输入进程前面的***,再输入回车/enter,Arthas会attach到目标进程上。
使用
基础命令
- help——查看命令帮助信息
- cat——打印文件内容,和linux里的cat命令类似
- pwd——返回当前的工作目录,和linux命令类似
- cls——清空当前屏幕区域
- session——查看当前会话的信息
- reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
- version——输出当前目标 Java 进程所加载的 Arthas 版本号
- history——打印命令历史
- quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
- shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
- ctrl+c——中断执行
jvm相关
- dashboard——当前系统的实时数据面板
- thread——查看当前 JVM 的线程堆栈信息
- jvm——查看当前 JVM 的信息
- sysprop——查看和修改JVM的系统属性
- sysenv——查看JVM的环境变量
- vmoption——查看和修改JVM里诊断相关的option
- logger——查看和修改logger
- getstatic——查看类的静态属性
- heapdump——dump java heap, 类似jmap命令的heap dump功能
class/classloader相关
- sc——查看JVM已加载的类信息
- sm——查看已加载类的方法信息
- jad——反编译指定已加载类的源码
- mc——内存编绎器,内存编绎.java文件为.class文件
- redefine——加载外部的.class文件,redefine到JVM里
- dump——dump 已加载类的 byte code 到特定目录
- classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
monitor/watch/trace相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令。
- monitor——方法执行监控
- watch——方法执行数据观测
- trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
- stack——输出当前方法被调用的调用路径
- tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
常用示例
watch
watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后。4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开。要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参。当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在。
观察方法返回值(-n 2表示只观察两次)
watch demo.MathGame primeFactors {returnObj} -x 2 -n 2
观察方法出参和返回值
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
观察方法入参
watch demo.MathGame primeFactors "{params}" -x 2 -b
只观察满足指定条件时的值
watch demo.MathGame primeFactors "{params[0]}" "params[0]<0"
观察异常信息
watch demo.MathGame primeFactors "{throwExp}" -e -x 2
按照耗时进行过滤
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
观察当前对象中的属性
watch demo.MathGame primeFactors 'target'
watch demo.MathGame primeFactors 'target.illegalArgumentCount'
当前对象中的属性,可以使用target关键字,代表当前对象,可以使用target.field_name访问当前对象的某个属性
trace
trace demo.MathGame run
过滤掉JDK方法
trace -j demo.MathGame run
据调用耗时过滤
trace demo.MathGame run '#cost > 10'