Alibaba Java 诊断工具 Arthas 使用

安装

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官网查询学习。



作者:0d1b415a365b
链接:https://www.jianshu.com/p/0f5947a5d491
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值