Arthas快速安装,启动,常用命令

发布时间 2023-10-26 14:38:29作者: 大树2

Arthas快速安装,启动,常用命令

Arthas 阿尔萨斯
是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率.

目录
0.快速安装,启动
一、常用命令
二、常用系统命令
三、JVM相关命令
四、class/classloader相关命令
五、高级命令

0.快速安装
curl -O https://arthas.aliyun.com/arthas-boot.jar

启动:java -jar arthas-boot.jar

一、常用命令
1、dashboard 仪表板

第一部分是显示JVM中运行的所有线程:所在线程组,优先级,线程的状态,CPU的占用率,是否是后台进程等

第二部分显示的JVM内存的使用情况

第三部分是操作系统的一些信息和Java版本号

2、通过 thread 命令来获取线程信息

1、当没有参数时,显示所有线程的信息

thread
2、展示当前最忙的前3个线程并打印堆栈

thread -n 3
3、显示1号线程的运行堆栈

thread 1
4、找出当前阻塞其他线程的线程,有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas提供了thread -b, 一键找出那个罪魁祸首。

thread -b
5、指定采样时间间隔,每过1000毫秒采样,显示最占时间的3个线程

thread -i 1000 -n 3
6、查看处于等待状态的线程

thread --state WAITING

3、通过 jad 来反编译获取源码

1、编译java.lang.String

jad java.lang.String
2、反编绎时只显示源代码,默认情况下,反编译结果里会带有ClassLoader信息,通过–source-only选项,可以只打印源代码。方便和mc/redefine命令结合使用。

jad --source-only demo.MathGame
3、反编译指定的方法

jad demo.MathGame main

4、watch监视

watch demo.MathGame(监视的包名和类名) primeFactors(监视的方法) returnObj(监视的返回值)

5、退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

二、常用系统命令
1、help 查看命令帮助信息

2、cat 打印文件内容,和linux里的cat命令类似 注:汉字有乱码的问题 如果没有写路径,则显示当前目录下的文件

3、grep 匹配查找,和linux里的grep命令类似,但它只能用于管道命令

4、pwd 返回当前的工作目录,和linux命令类似

5、cls 清空当前屏幕区域

6、session 查看当前会话的信息

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

8、version 输出当前目标 Java 进程所加载的 Arthas 版本号

9、history 打印命令历史

10、quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

11、stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出

12、keymap Arthas快捷键列表及自定义快捷键

**三、JVM相关命令 **
1、sysprop:查看和修改JVM的系统属性

查看所有属性

sysprop

查看单个属性,支持通过tab补全

sysprop java.version

修改单个属性

sysprop user.country

sysprop user.country CN

2、sysenv:查看当前JVM的环境属性

查看所有属性

sysenv

查看单个环境变量

sysenv USER

3、vmoption:查看,更新JVM诊断相关的参数

查看所有的选项

vmoption

查看指定的选项

vmoption PrintGCDetails

更新指定的选项

vmoption PrintGCDetails true

4、 getstatic:查看类的静态属性

getstatic 类名 属性名

5、ognl:可替代上面getstatic命令

调用静态函数

ognl '@java.lang.System@out.println("hello")'

获取静态类的静态字段

ognl '@demo.MathGame@random'

执行多行表达式,赋值给临时变量,返回一个List

ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}

四、class/classloader相关命令
1、sc: 查看JVM已加载的类信息

2、sm :查看已加载类的方法信息

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 展示每个方法的详细信息
[E] 开启正则表达式匹配,默认为通配符匹配
3、jad:反编译指定已加载类的源码。

参数名称 参数说明
class-pattern 类名表达式匹配
[E] 开启正则表达式匹配,默认为通配符匹配
4、mc:编译.java文件生成.class

在内存中编译Hello.java为Hello.class

mc /root/Hello.java

可以通过-d命令指定输出目录

mc -d /root/bbb /root/Hello.java

5、redefine:加载外部的.class文件,redefine到JVM里

注意, redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field),参考jdk本身的文档。

    1、reset命令对redefine的类无效。如果想重置,需要redefine原始的字节码。

    2、redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果 再执行上面提到的命令,则会把redefine的字节码重置。

    3、不允许新增加field/method 正在跑的函数,没有退出不能生效

    4、结合 jad/mc 命令使用 

            # 1. 使用jad反编译demo.MathGame输出到/root/MathGame.java

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

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

                    mc /root/MathGame.java -d /root

            # 3.使用redefine命令加载新的字节码

                    redefine /root/demo/MathGame.class

五、高级命令
1、dump: 将正在JVM中运行的程序的字节码文件提取出来,保存在logs相应的目录下,不同的类加载器放在不同的目录

参数名称 参数说明
class-pattern 类名表达式匹配
[c:] 类所属 ClassLoader 的 hashcode
[E] 开启正则表达式匹配,默认为通配符匹配

把String类的字节码文件保存到~/logs/arthas/classdump/目录下

dump java.lang.String

把demo包下所有的类的字节码文件保存到~/logs/arthas/classdump/目录下

dump demo.*

2、classloader:获取类加载器的信息

默认按类加载器的类型查看统计信息

classloader
按类加载器的实例查看统计信息,可以看到类加载的hashCode

classloader -l
查看ClassLoader的继承树

classloader -t
通过类加载器的hash,查看此类加载器实际所在的位置

classloader -c 680f2737
使用ClassLoader去查找指定资源resource所在的位置

classloader -c 680f2737 -r META-INF/MANIFEST.MF
使用ClassLoader去查找类的class文件所在的位置

classloader -c 680f2737 -r java/lang/String.class
使用ClassLoader去加载类

classloader -c 70dea4e --load java.lang.String

3、monitor:监控指定类中方法的执行情况

每5秒监控一次,类demo.MathGame中primeFactors方法

monitor -c 5 demo.MathGame primeFactors

4、watch :观察到指定方法的调用情况

class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
express 观察表达式
condition-express 条件表达式
[b] 在方法调用之前观察 before
[e] 在方法异常之后观察 exception
[s] 在方法返回之后观察 success
[f] 在方法结束之后(正常返回和异常返回)观察 finish
[E] 开启正则表达式匹配,默认为通配符匹配
[x:] 指定输出结果的属性遍历深度,默认为 1

5、trace :方法调用耗时追踪

trace函数指定类的指定方法

trace demo.MathGame run
如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用就退出命令。

trace demo.MathGame run -n 1
默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置–skipJDKMethod false。

trace --skipJDKMethod false demo.MathGame run
据调用耗时过滤,trace大于0.5ms的调用路径

trace demo.MathGame run '#cost > .5'
可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。

trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

6、stack:查看方法调用链

获取primeFactors的调用路径

stack demo.MathGame primeFactors
条件表达式来过滤,第0个参数的值小于0,-n表示获取2次

stack demo.MathGame primeFactors 'params[0]<0' -n 2
据执行时间来过滤,耗时大于0.5毫秒

stack demo.MathGame primeFactors '#cost>0.5'

7、tt:查看方法的出入参数

tt的参数 说明
-t 记录某个方法在一个时间段中的调用
-l 显示所有已经记录的列表
-n 次数 只记录多少次
-s 表达式 搜索表达式
-i 索引号 查看指定索引号的详细调用信息
-p 重新调用指定的索引号时间碎片
记录下当前方法的每次调用环境现场。

tt -t demo.MathGame primeFactors

8、options:全局开关

查看所有的options

options

获取option的值

options json-format

设置指定的option,打开执行结果存日志功能,输入如下命令即可:

options save-result true