掘金 后端 ( ) • 2024-04-23 16:51

零、Arthas能做什么

来自Arthas官网的介绍。

image.png

一、安装

2.1  方式一:only arthas

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

2.2  方式二:全量包

https://arthas.aliyun.com/download/latest_version?mirror=aliyun

二、idea安装arthas插件

插件是为了方便快速的生成arthas命令,也可以手动输入命令。

image.png

三、运行

3.1  两步走方式

image.png

3.1.1 先启动arthas

java -jar arthas-boot.jar

3.1.2 挂到JVM进程上

输入1即可

3.2 一步到位方式

java -jar arthas-boot.jar pid

image.png

四、常用命令

4.1 watch

方法执行数据观测,让你能方便的观察到指定方法的调用情况。

watch 命令定义了4个观察事件点,即 -b 方法调用前, -e 方法异常后, -s 方法返回后, -f 方 法结束后(类似AOP);

4个观察事件点 -b 、 -e 、 -s 默认关闭, -f 默认打开,当指定观察点被打开后,在相应事件点会 对观察表达式进行求值并输出。

image.png

4.2 trace

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

只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如 trace *StringUtils isBlank '#cost>100' 表示当执行时间超过 100ms的时候,才会输出trace的结果。

image.png

4.3 monitor

用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息

image.png

4.4 stack

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

很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这 个方法是从那里被执行了,此时你需要的是 stack 命令。

image.png

4.4 tt

记录下指定方法每次调用的入参和返回信息,并能对这些不同时间下调用的信息进行观测。

image.png

4.4.1 tt-i index

对于具体一个时间片的信息而言,你可以通过 -i 参数后边跟着对应的 INDEX 编号查看到他的详细信息。

image.png

4.4.2 tt -i index -p 重做一次调用

当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。 tt 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p 参数。通过 --replay-times 指定 调用次数, 通过 --replay-interval 指定多次调用间隔(单位ms, 默认1000ms)

image.png

4.5  dashboard命令展示当前进程的信息

image.png

4.6 thread命令获取线程详细信息

image.png

4.7 jad反编译指定的类

image.png

4.8 退出Arthas

按Q或者Ctrl+C即可

4.9 ONGL条件表达式解决方法重载

4.9.1 指定请求参数的长度

tt -t *Test print params.length==1

4.9.2 指定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写

tt -t *Test print 'params[1] instanceof Integer'

4.9.3 指定请求参数的值

tt -t *Test print params[0].mobile=="12344566778899"

五、其他命令

5.1 classloader

  1. 显示所有类加载器的信息

  2. 获取某个类加载器所在的jar包

  3. 获取某个资源在哪个jar包中

  4. 加载某个类

image.png

5.2 dump

将已加载类的字节码文件保存到特定目录:logs/arthas/classdump/

image.png

5.3 JVM

查看当前JVM的信息

image.png

5.4 sysprop

查看和修改JVM的系统属性

image.png

5.5 sc

查看JVM已经加载的类信息

image.png

5.6 sm

查看已经加载类的方法信息

5.7 redefine

加载外部的.class文件,redefine到JVM中

5.8 reset

重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

5.9 mc

Memory Compiler/内存编译器,编译 .java 文件生成 .class

image.png

六、彩蛋

6.1使用jad反编译demo.HelloWorld输出到/root/HelloWorld.java

jad --source-only demo.HelloWorld > /root/HelloWorld.java

6.2按上面的代码编辑完毕以后,使用mc内存中对新的代码编译

mc /root/HelloWorld.java -d /root

6.3使用redefine命令加载新的字节码 redefine /root/demo/HelloWorld.class