阿里Arthas使用介绍

介绍

Arthas是阿里开源的Java诊断工具,功能很齐全,交互友好。

市面上有挺多类似的工具的,比如jdk自带的JCMD、jmap等等,还有阿里的Greys等。 对比起来,Arthas会更易于使用一些,功能更全。

安装

安装特别简单

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

之后就进入到了命令行界面了,会显示出来当前当前的java进程,之后选择序号输入即可。

image-20200508180925640

命令说明

官方的说明文档介绍的很详细,可以具体参见说明文档使用,这里主要提几个个人认为比较常用的命令。

PS:

官网文档:https://alibaba.github.io/arthas/index.html

dashbord

image-20200509094552309

thread

查看当前的进程中线程的使用情况。

thread -b 可以查看当前堵塞的线程情况,但仅对synchronized关键字产生的堵塞生效,Lock下的堵塞不生效。

thread -n 3 可以展示当前最忙的3个线程堆栈信息。

thread 命令类似top -H -p 命令,可以找出当前占用CPU最多的线程,然后拿到ID之后,继续查看线程堆栈信息,比top -H -p + jstack的方式排查线程占用多的情况,要简单快捷的多。

其余thread相关功能,可以看官方说明

image-20200509095940805

jvm

jvm命令,可以显示当前jvm的一些基本信息。

image-20200509125111298

vmoption

这个命令挺实用的,可以查看当前的JVM的一些配置参数。关键在于,他不仅可以查看,还可以更新。

image-20200509125723975

比如,如果我们线上最开始对GC日志记录不全,比如没有记录时间戳之类的,也就是 PrintGCTimeStamps PrintGCDateStamps 等参数,那我们可以后期通过vmoption设置打开。比如:vmoption PrintGCDetails true 即可更新参数配置为开启状态

BTW:建议一直设置这些参数。

heapdump

类似jmap -heap dump

dump到指定文件 : heapdump /tmp/dump.hprof

只dump live对象: heapdump --live /tmp/dump.hprof

dump到临时目录:heapdump

整体功能比jmap要简单一些。 和之前提到的JCMD相比,也省掉了pid的输入,相对更简单些。

image-20200509132132320

getstatic 和ognl

这两个命令感觉比较高阶一些,没线上实际应用过。比如 上线后,想看下某个静态变量的最终值,可以通过这两个命令取查看到。

sc 和sm

这两个命令的含义分别是,扫描已加载的类信息和已加载的方法信息。

比如,我们之前的RPC框架在加载类的时候,类名相同的会出现加载覆盖的情况,进而导致序列化失败的问题。这种情况下,可以通过sc查看当前的实体类具体是哪个被加载了,可以比较快速的发现原因及问题。

比如下面这个,能看出来,这个实体类实际上加载的是这个包下的PositionData实体。

image-20200509133252744

sc -d [class-name] 还能看到具体的类信息。包含基本信息描述、加载的classloader等

image-20200509133602994

dump

dump已加载类的bytecode到指定目录。 这种可以看下加载到JVM之后的字节码长啥样。

monitor

方法的执行监控,可以监控方法的执行耗时,失败次数等等。 很实用的一个命令,可以用来分析线上代码的性能问题,而不需要再在具体的方法上打日志,再上线才能看到耗时情况。

monitor -c 5 className mehtodName 每5秒为一周期,统计方法执行情况。

image-20200509141322849

另:方法的失败次数是指: 当方法执行抛出异常时,则认为失败,失败次数+1 。具体可以看下arthas的源码:

image-20200509135104736

trace

方法内部调用路径,并输出方法路径上的每个节点上耗时。也很实用,可以更快的看出来耗时主要在哪

image-20200509141906895

reset

trace monitor等命令会对原有的字节码进行增强,所以排查问题之后,需要重置下字节码到最初的状态。 reset可以做重置。

shutdown

关闭arthas。关闭的时候也会调用reset

其他

arthas的友好之处还在于,他实现了几个常用的linux命令,这样就可以不用退出当前的arthas终端做一些操作。 比如cat 查看一个文件内容,pwd展示当前的目录。比较贴心。

补充

  1. 官方文档写的很详细,可以翻阅官方文档:https://alibaba.github.io/arthas/
  2. bistoury:去哪儿网基于arthas做的二次开发,支持可视化界面。 官网:https://github.com/qunarcorp/bistoury