目录
背景
上周在工作中遇到了一个bug,在服务器上可以复现,但是本地调试无法复现。于是想到了arthas,觉得有必要简单写一篇博客记录下arthas的简单使用。
安装
1、下载Arthas
直接在服务器上:
wget https://alibaba.github.io/arthas/arthas-boot.jar
执行完毕后会在相当于在当前路径下载并且安装了arthas,如果安装成功的话当前路径下会有一个arthas-boot.jar的jar包。
2、启动
在arthas安装的路径下:
java -jar arthas-boot.jar
就是启动jar包的方式,正常启动的话会像下图的样式:
出现了当前服务器上所有在运行的jar,输入要监控的jar的序号,比如20015的话就输入5,然后回车,出现如下界面:
这个样式就相当于正常进入到了arthas,并且监控到了20015服务。
3、常用命令
3.1、dashboard
当前系统的实时数据面板,相当于监控大盘,如下图
可以注意到上面显示了每一个线程的ID、名称、所属group、优先级、当前状态、占用CPU百分比等。这里线程状态比较重要,如果是阻塞状态的话会直接显示BLOCKED。
3.2、thread
和dashboard不同的是,只显示线程相关信息,dashboard相当于啥都有。
3.3、thread id
打印指定id的线程的详细状态,如果是阻塞或等待状态的话会显示阻塞的位置,id就是dashboard或者thread面板里面线程的编号,比如thread 33,如下图:
3.4、thread -b
打印所有处于blocked状态的线程,并且会标注出来blocked的具体位置,感觉这个非常实用,如下图:
3.5、thread -n 5
打印出最消耗CPU的前5个线程
3.6、stack 全类名 方法名
查看某个方法的调用堆栈,比如,stack com.haozz.demo.DemoManager demoMethod
3.7、trace 全类名 方法名
查看某个方法的哪个子调用最慢,耗时最久的会用红色标注,
3.8、monitor 全类名 方法名
监控某个方法的调用统计,包括总调用次数,平均运行时间,成功率等信息
3.9、jad 全类名
反编译class,查看源码
题外话,我在使用上面3.5、3.6、3.7这三个命令的时候发现,如果某个方法中有一个子方法报错了,那么这个方法的堆栈信息也是打不出来的,但是报错的子方法之前的子方法的堆栈是可以打出来。不知道是不是我理解的不太对,但是一句这一点也可以定位到问题的点。
关于arthas的文章有很多,这篇也只是记录一些最基础简单的使用。最后放上Arthas的使用手册。