介绍
Arthas是阿里开源的Java诊断工具,功能很齐全,交互友好。
市面上有挺多类似的工具的,比如jdk自带的JCMD、jmap等等,还有阿里的Greys等。 对比起来,Arthas会更易于使用一些,功能更全。
安装
安装特别简单
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
之后就进入到了命令行界面了,会显示出来当前当前的java进程,之后选择序号输入即可。
命令说明
官方的说明文档介绍的很详细,可以具体参见说明文档使用,这里主要提几个个人认为比较常用的命令。
PS:
dashbord
thread
查看当前的进程中线程的使用情况。
thread -b
可以查看当前堵塞的线程情况,但仅对synchronized
关键字产生的堵塞生效,Lock下的堵塞不生效。
thread -n 3
可以展示当前最忙的3个线程堆栈信息。
thread
命令类似top -H -p 命令,可以找出当前占用CPU最多的线程,然后拿到ID之后,继续查看线程堆栈信息,比top -H -p
+ jstack
的方式排查线程占用多的情况,要简单快捷的多。
其余thread相关功能,可以看官方说明
jvm
jvm命令,可以显示当前jvm的一些基本信息。
vmoption
这个命令挺实用的,可以查看当前的JVM的一些配置参数。关键在于,他不仅可以查看,还可以更新。
比如,如果我们线上最开始对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的输入,相对更简单些。
getstatic 和ognl
这两个命令感觉比较高阶一些,没线上实际应用过。比如 上线后,想看下某个静态变量的最终值,可以通过这两个命令取查看到。
sc 和sm
这两个命令的含义分别是,扫描已加载的类信息和已加载的方法信息。
比如,我们之前的RPC框架在加载类的时候,类名相同的会出现加载覆盖的情况,进而导致序列化失败的问题。这种情况下,可以通过sc查看当前的实体类具体是哪个被加载了,可以比较快速的发现原因及问题。
比如下面这个,能看出来,这个实体类实际上加载的是这个包下的PositionData实体。
sc -d [class-name]
还能看到具体的类信息。包含基本信息描述、加载的classloader等
dump
dump已加载类的bytecode到指定目录。 这种可以看下加载到JVM之后的字节码长啥样。
monitor
方法的执行监控,可以监控方法的执行耗时,失败次数等等。 很实用的一个命令,可以用来分析线上代码的性能问题,而不需要再在具体的方法上打日志,再上线才能看到耗时情况。
monitor -c 5 className mehtodName
每5秒为一周期,统计方法执行情况。
另:方法的失败次数是指: 当方法执行抛出异常时,则认为失败,失败次数+1 。具体可以看下arthas的源码:
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时。也很实用,可以更快的看出来耗时主要在哪
reset
trace
monitor
等命令会对原有的字节码进行增强,所以排查问题之后,需要重置下字节码到最初的状态。 reset可以做重置。
shutdown
关闭arthas。关闭的时候也会调用reset
其他
arthas的友好之处还在于,他实现了几个常用的linux命令,这样就可以不用退出当前的arthas终端做一些操作。 比如cat 查看一个文件内容,pwd展示当前的目录。比较贴心。
补充
- 官方文档写的很详细,可以翻阅官方文档:https://alibaba.github.io/arthas/
- bistoury:去哪儿网基于arthas做的二次开发,支持可视化界面。 官网:https://github.com/qunarcorp/bistoury
TODO
- MBean