网站
https://arthas.aliyun.com/doc/quick-start.html
下载
网络通:curl -O https://arthas.aliyun.com/math-game.jar
网络不通:https://arthas.aliyun.com/download/latest_version?mirror=aliyun
部署
1、将下载的压缩包放入openjdk11linux64.1/bin/文件夹中,
2、通过unzip arthas-bin.zip 解压到当前文件夹
3、cd 到 openjdk11linux64.1/bin 文件夹
4、netstat -tunlp | grep “8123” (通过该命令查找端口对应的进程号)
5、./java -jar arthas-boot.jar 12521 (12521 是第四步查出的端口号对应进程号)
6、至此完成arthas的部署工作
7、退出客户端使用stop命令,退出当前连接使用quit或exit,中断执行使用ctrl+C。
dashboard 查看进程信息
jvm参数
COUNT: JVM 当前活跃的线程数
DAEMON-COUNT: JVM 当前活跃的守护线程数
PEAK-COUNT: 从 JVM 启动开始曾经活着的最大线程数
STARTED-COUNT: 从 JVM 启动开始总共启动过的线程次数
DEADLOCK-COUNT: JVM 当前死锁的线程数
menory命令
内存占用情况
TRACE命令
主要用于统计方法耗时
基本格式:
trace 包名.类名 方法名
统计最耗时的方法(*任意匹配)
trace 包名.类名 *
只展示耗时大于10ms的调用
trace 启动类 run ‘#const > 10’
trace次数限制
trace 启动类 run -n 5
trace多个类或者方法(-E开启正则,|进行多个类或者方法分割)
trace -E 全限定类名1|全限定类名2 方法名1|方法名2
sc jad mc redefine(推荐retransform)在线修改代码
以在代码中加入一段日志打印为例:
1、使用sc命令查看指定类的加载信息:主要记录类的classLoaderHash值:
sc -d 全限定类名
2、使用jad进行反编译,到指定目录
jad --source 全限定类名 > 指定目录
3、修改代码
进入指纹目录生成的反编译文件,修改代码,录入加入一句日志打印
4、使用mc内存编译器编译代码,-c指定类的hash值(之前sc -d记录的hash值),-d是编译文件的输出目录
sc -c hash值 全限定类名 -d 指定编译结果输出目录
5、使用refedine重新加载编译后的class文件
6、触发代码,查看结果
注意:
1、reset对redefine无效,如果想重置需要使用redefine加载原始的字节码文件
2、使用jad、wathc、trace、monitor、tt等命令后,redefine之后的修改会失效,推荐使用retransform,改命令不会失效
3、使用mc编辑jad的反编译代码可能失败,可以本地编译好后上传加载
4、redefine限制:
①不运行新增字段、方法
②正在拍的方法,没有退出不能生效
retransform 加载class文件
与redefine的区别是,该命令不会被其他命令重置失效
格式:retransform class文件路径
查看所有加载的class:
格式:retransform -l
删除指定加载的class(1就是id):
格式:retransform -d 1
删除所有的加载的class:
格式:retransform --deteleAll
消除retransForm影响:
1、删除加载的class:retransform -d -1
2、重新加载原始的class:retransform 原始class的文件位置(原始jar包解压后class位置)
monitor方法执行监控
格式:monitor -c 5 全限定类名 方法名(5s统计周期统计一次,默认120s)
条件过滤:第二个参数为false才记录
格式:monitor -c 5 全限定类名 方法名 “params[1] == false”
条件过滤:第一个参数为字符"f2a87d4e41564641a756108936062af6"时记录(字符串需要转义)
格式:monitor -c 5 全限定类名 方法名 "params[0] == “f2a87d4e41564641a756108936062af6"”
tt 查看方法调用情况
格式:(-t记录调用情况,-n 3只记录3次,方式jvm爆掉。'params[0] instanceof String’第一个参数是String类型,params.length==1方法的参数个数是1)
tt -t -n 3 权限的类名 方法名 ‘params[0] instanceof String’
格式:tt -i 1010(查看详细调用情况,1010是前一步记录的id号)
格式:tt -i 1010 -p(重新触发调用)
wathc命令
方便观察指定方法的调用情况
格式:
watch 全限定类名 方法名 -x 2 -b -s -n 3
(-x 2深度为2,-b方法执行前观察,-s方法执行后观察,-n 3观察3次)
条件观察
格式:watch 全限定类名 方法名 -x 2 -b -s -n 3 “{params[0],target}” “params[0] != null”
异常观察
格式:watch 全限定类名 方法名 “{params[0],throwExp}” “params[0] != null” -e
耗时过滤
格式:watch 全限定类名 方法名 “{params,returnObj}” “#cost>200”(观察耗时超过200ms的处理)
sysenv 查看环境变量
基础命令
清屏 cls
查看历史命令 history
当前会话信息 session