安装
curl -L https://alibaba.github.io/arthas/install.sh | sh
启动
安装目录下 ./as.sh 启动, 然后按照列出的进程列表,输入序号选择要诊断的应用
常用命令
官网(https://alibaba.github.io/arthas/commands.html)上有所有命令的文档,这里只写几个比较常用并且文档说明不够详细的。
dashboard
可以查看线程,内存使用情况,gc情况以及一些环境信息。一定程度上可以替代jstack, jstat, jmapclassloader
列出当前 jvm 中所有的类加载器。 一般带上 -l 参数,打出加载器的 hashcode,结合别的命令使用,后续会说明。sc
search class, 查找 jvm 加载的类,常用于诊断ClassNotFoundException,或者查找完整的类路径
$ sc *.String
java.lang.String
Affect(row-cnt:1) cost in 12 ms.
- sm
search method, 查找类中的方法,第一个参数为类名,第二个参数方法名
$ sm java.lang.String *Of
java.lang.String indexOf(Ljava/lang/String;I)I
java.lang.String indexOf(I)I
java.lang.String indexOf(II)I
java.lang.String indexOf([CII[CIII)I
java.lang.String indexOf(Ljava/lang/String;)I
java.lang.String valueOf(F)Ljava/lang/String;
java.lang.String valueOf(D)Ljava/lang/String;
java.lang.String valueOf(Z)Ljava/lang/String;
java.lang.String valueOf([CII)Ljava/lang/String;
java.lang.String valueOf([C)Ljava/lang/String;
java.lang.String valueOf(Ljava/lang/Object;)Ljava/lang/String;
java.lang.String valueOf(C)Ljava/lang/String;
java.lang.String valueOf(I)Ljava/lang/String;
java.lang.String valueOf(J)Ljava/lang/String;
java.lang.String copyValueOf([CII)Ljava/lang/String;
java.lang.String copyValueOf([C)Ljava/lang/String;
java.lang.String lastIndexOf(I)I
java.lang.String lastIndexOf(II)I
java.lang.String lastIndexOf(Ljava/lang/String;I)I
java.lang.String lastIndexOf(Ljava/lang/String;)I
java.lang.String lastIndexOf([CII[CIII)I
Affect(row-cnt:21) cost in 11 ms.
- ognl
堪称神器的一个命令。可以执行 ognl 表达式,通过 ognl 表达式可以:- 查看静态字段在内存中的值
ognl表达式格式:ognl '@className@staticFieldName' e.g: ognl '@org.apache.commons.httpclient.HttpStatus@SC_OK' @Integer[200]
- 不中断程序的情况下执行某个方法,可以替代远程debug
ognl `@className@methodName(params)` e.g: ognl '@org.apache.commons.lang3.StringUtils@split("1,2,3", ",")' @String[][ @String[1], @String[2], @String[3], ]
- 查看静态字段在内存中的值
官方文档描述不详的几点补充说明:
- ognl 执行时提示
这个需要配合前文的 classloader -l 指定类的加载器,因为默认使用的是BootstrapClassLoader, 而实际上我们要调试的类很可能是由AppClassLoader加载的(ClassLoader知识不足的同学请自行补课)。Failed to get static, exception message: java.lang.NullPointerException, please check $HOME/logs/arthas/arthas.log for more details.
通过 ognl 的 -c 参数可以指定类加载器。碰到报错检查表达式正确的情况下优先考虑检查类加载器。 - 执行静态成员的非静态方法
取到静态字段然后通过 "." 操作符调用ognl '@className@fieldName.methodName(params)'
- 执行非静态类的非静态方法
需要提供获取类实例的方法,一般单例或者 spring 调试时才能用到ognl '@singletonClass@getInstance.methodName(params)' e.g: ognl '@java.util.concurrent.TimeUnit@SECONDS.toMillis(1)' @Long[1000]
- jad
反编译class,一般用于确认运行的代码是否是自己提交的代码。
更多命令的使用可以通过Arthas官网查询学习。