# Arthas 阿尔萨斯

参考视频 (opens new window)

ls -a 查看隐藏文件夹

退出 quit exit 停止 stop

# 1 安装

#安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar  启动

#查看占用的端口
netstat -anp | grep 9082
#查看进程详情
ps -ef | grep 29119
#杀死进程
kill -9 29119
#换端口号
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1   

#安装位置
/root/.arthas/lib/3.5.0/arthas
#数学游戏demo
java -jar arthas-demo.jar

# 2 attach一个进程 (关联选择的进程)

如果无法attach进程,可以查看日志/root/logs/arthas

# 4 基础命令 1

help 查看命令帮助信息
cat  查看文件内容
grep  只能用于管道命令
参数: -n  显示行号
       -i   忽略大小写
       -m  行数     显示最大行数  -m10
       -e 正则表达式
pwd    当前所在工作目录
cls   清屏 (windows的命令)

# 5 基础命令 2

session   查看会话信息
reset     重置增强类
version    当前arths版本
history    输入过的所有命令
quit       退出当前客户端
keymap      键盘映射

image-20210309230523444

# 6 jvm相关命令 1

dashboard仪表板
thread    查看所有正在运行的线程
jvm        虚拟机相关
sysprop   系统属性相关

1 dashboard

image-20210309231121239

2 thread 查看所有线程

thread 1  查看id为1的线程
参数: -n  thread -n 3    显示最忙的3个线程
      -b   查看死锁
      -i   thread -i 1000 -n 3   每1000毫秒显示最忙的3个线程
      --state   thread --state WAITING   查看所有等待的线程

3 jvm

4 sysprop

# 7 jvm相关命令 2

sysenv   查看环境变量
vmoption   虚拟机选项
getstatic  查看类的静态属性  getstatic 类名 属性名
ognl       替代getstatic

image-20210309233300031

# 8 class/classloader 相关命令1

sc   查找类  Search Class
sm   查找方法 Search Method

# 9 class/classloader 相关命令2

jad   把字节码反编译源码
mc    在内存中把源码编译成字节码文件
redefine  把新生成的字节码文件在内存中执行


jad --source-only demo.MathGame  只显示源码


dump    将正在运行的程序的字节码文件保存    /logs/arthas/classdump

classloader     获取类加载器的信息  某个类加载器在哪个jar包   资源在哪个jar包

# monitor

# 监控指定类中方法的执行情况 默认120s返回一次


# 5秒返回一次执行情况
monitor demo.MathGame primeFactors -c 5

image-20210310231606710

# watch

# 观察指定方法的调用情况

image-20210310231908788

# 执行primeFactors方法的出参和返回值,结果属性遍历深度为2
watch demo.MathGame primeFactors "{params,returnObj}" -x 2

# -b 方法执行前,所以返回为null
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b

image-20210310233614650

#方法运行前看方法的对象
watch demo.MathGame primeFactors "target" -x 2 -b

image-20210310233759067

#查看方法的对象的某个属性
watch demo.MathGame primeFactors "target.illegalArgumentCount" -x 2

image-20210310234612792

#方法调用前,调用后,只执行两次
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2

image-20210310234749918

# 输出小于0的情况
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"

image-20210310235109316

# trace

# 对方法内部调用路径进行追踪,并输出方法路径的每个节点上耗时

#对run方法进行追踪
trace demo.MathGame run

image-20210310235543442

#对run方法进行追踪 -n 2 获取两次,--skipJDKMethod 显示执行方法
trace --skipJDKMethod false demo.MathGame run -n 2

image-20210310235845665

#执行耗时大于1毫秒的   0.5毫秒写 .5
trace demo.MathGame run '#cost > 1'

image-20210311000025992

# stack

# 输出当前方法被调用的调用路径

#primeFactors方法的调用路径
stack demo.MathGame primeFactors

image-20210311000253994

#primeFactors方法的第0个参数的值小于0,获取2次     耗时也可以查询
stack demo.MathGame primeFactors 'params[0]<0' -n 2

image-20210311000412017

# tt 时间隧道

# 记录指定方法每次调用的入参和返回信息

image-20210311000834806

#查询方法的调用和返回信息
tt -t demo.MathGame primeFactors

image-20210311000944796

image-20210311001107710

tt -l 查看所有的记录

# options 全局开关

image-20210311001320308

image-20210311001433884

# profiler 火焰图

profiler start 启动 profiler list 查看支持的事件 profiler getSamples 获取的样本 profiler status 获取状态 profiler stop 停止,并输出.svg图

image-20210311110134251

X轴越长,代表使用的越多,Y轴是调用堆栈信息,顶部是正在执行的函数,下方是父函数

# 实战

查询哪个耗时最多

image-20210311002626771

2 对耗时方法进行反编译 只显示源码

image-20210311002815129

3 查询方法的返回值

image-20210311003106396

4 查询controller 的入参和返回值,2个深度
watch com.controller.* * '{params,returnObj}' -x 2

image-20210311003254680

image-20210311003523148

trace 追踪最耗时的 jad 反编译 watch 用来监视每个方法的参数和返回值