Arthas 常用命令

Arthas的完整依赖包下载地址:https://github.com/alibaba/arthas/releases


# 启用Arthas交互界面,进入后选择对应的java进程
java -jar arthas-boot.jar

# 查看dashboard,包括进程的内存,cpu等使用信息
dashboard

# 打印线程id为1的栈信息,id可以从dashboard获取,这里是获取线程main方法的栈信息
thread 1 | grep 'main('

# 定位阻塞线程,只支持定位synchronized
thread -b 

# 查看1000ms内,最忙的三个线程
thread -n 3 -i 1000

# 查看指定状态的线程
thread --state WAITING

# 反编译指定类。也可以反编译指定方法,也可以指定classloader
jad demo.MathGame

# 实时查看 demo.MathGame#primeFactors 方法的返回值
watch demo.MathGame primeFactors returnObj

# quit或者exit不会终止附着在目标上的Arthas进程,必须执行stop来完全终止
stop

# help
help

# Arthas快捷键列表
keymap

# Arthas版本
version

# 清屏
cls

# 查看当前会话信息
session

# 还原对类的增强调整
reset

# jvm信息
jvm

# 修改或者查看JVM系统属性,不带参数会展示所有JVM系统属性,可以通过tab自动补全
sysprop user.country CN

# 查看JVM环境变量,不该参数展示所有,支持tab补全
sysenv USER

# 查看或者修改vm参数,不带参数展示所有,支持tab补全
vmoption PrintGC true

# 查看日志信息,包括等级,文件等
logger

# 修改日志等级,name是logger中展示的属性
logger --name ROOT --level debug

# 查看没有appender的logger信息
logger --include-no-appender

# 查看JVM加载的类的信息,包括classloader和classloader hash和字段信息
sc -d -f demo.MathGame

# 查看类的静态属性
getstatic demo.MathGame random

# 类似jmap命令的heap dump功能。下面是到指定文件
heapdump /tmp/dump.hprof

# 只选择live的对象dump
heapdump --live /tmp/dump.hprof

# 查看内存中的指定对象
vmtool --action getInstances --className java.lang.String --limit 10

# 强制GC
vmtool --action forceGc

# 查看已加载类的方法信息
sm -d java.lang.String toString

# 编译代码并且输出到指定目录
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java

# 本地将class文件转为base64并保存,这种方法可以绕过部分服务不能上传文件的情况
base64 < Test.class > result.txt

# 可以将base64内容复制并粘贴到对应机器,保存为text,然后执行一下命令恢复
base64 -d < result.txt > Test.class

# 加载并替换指定class文件,加载一次会记录一个 retransform entry
# 注意:不允许新增 field/method;正在跑的函数,没有终止的不会生效
retransform /tmp/MathGame.class

# 查看替换的class记录
retransform -l

# 删除指定的替换,id从命令 retransform -l 中获取
retransform -d 1

# 删除所有替换
retransform --deleteAll

# 显示触发替换,前提要已经执行过加载。会加载entry中最后加入的替换(id最大)
# 如果要删除类的替换,需要删除替换,并重新执行触发
retransform --classPattern demo.MathGame

# 查看classloader信息
classloader

# 监听方法的执行时间,执行状态。
# 下面的语句代表:每五秒统计一次 MathGame类 的 primeFactors 方法的执行状态,并且保证方法的第一个参数在执行方法完毕`后`的值小于等于2
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"

# 下面的语句代表:每五秒统计一次 MathGame类 的 primeFactors 方法的执行状态,并且保证方法的第一个参数在执行方法完毕`前`的值小于等于2
monitor -b -c 5 com.test.testes.MathGame primeFactors "params[0] <= 2"

# 观察MathGame类的primeFactors方法的参数,对象属性和返回值,遍历深度为2
watch demo.MathGame primeFactors -x 2

# 打印方法内部调用路径,并统计路径上的时间开销。这里代表只有花费时间大于10ms的调用才打印
trace demo.MathGame run '#cost > 10'

# 输出方法被调用的路径。这里代表第一个参数小于0,并且只获取前两次调用
stack demo.MathGame primeFactors 'params[0]<0' -n 2

# 记录方法每次调用的入参出参
tt -t demo.MathGame primeFactors
# 解决重载
tt -t *Test print params.length==1
tt -t *Test print 'params[1] instanceof Integer'
# 指定参数值
tt -t *Test print params[0].mobile=="13989838402"

# 展示所有tt记录
tt -l

# 筛选tt列表,这里筛选参数名称
tt -s 'method.name=="primeFactors"'

# 检索指定tt记录,这里的1003是tt列表的index
tt -i 1003

# 重新触发执行tt列表中的记录
tt -i 1004 -p

# 观察指定记录的成员变量
tt -w 'target.illegalArgumentCount'  -x 1 -i 1000