美文网首页
Alibaba Java 诊断工具 Arthas 使用

Alibaba Java 诊断工具 Arthas 使用

作者: 0d1b415a365b | 来源:发表于2019-02-25 14:12 被阅读0次
Arthas.png

安装

curl -L https://alibaba.github.io/arthas/install.sh | sh

启动

安装目录下 ./as.sh 启动, 然后按照列出的进程列表,输入序号选择要诊断的应用

常用命令

官网(https://alibaba.github.io/arthas/commands.html)上有所有命令的文档,这里只写几个比较常用并且文档说明不够详细的。

  • dashboard
    可以查看线程,内存使用情况,gc情况以及一些环境信息。一定程度上可以替代jstack, jstat, jmap

  • classloader
    列出当前 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 执行时提示
    Failed to get static, exception message: java.lang.NullPointerException, please check   $HOME/logs/arthas/arthas.log for more details.
    
    这个需要配合前文的 classloader -l 指定类的加载器,因为默认使用的是BootstrapClassLoader, 而实际上我们要调试的类很可能是由AppClassLoader加载的(ClassLoader知识不足的同学请自行补课)。
    通过 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官网查询学习。

相关文章

网友评论

      本文标题:Alibaba Java 诊断工具 Arthas 使用

      本文链接:https://www.haomeiwen.com/subject/amowyqtx.html