先援引官方一段话:php
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜好。当你遇到如下相似问题而一筹莫展时,Arthas能够帮助你解决:vue
而后上个图吧:java
图上能够看到Arthas支持的命令,各个命令的具体使用可参见官方文档:alibaba.github.io/arthas。git
这里为何把Arthas这个东西拿出来讲,是由于:尽管VisualVM已经在转储、监控、快照等方面作得很到位了,可是对于某些领域,它仍有不足!这时候,Arthas能够发挥一下它的优点。具体领域体如今:github
thread
可直接查看线程的cpu占用比(前篇文件也可看出,VisualVM查看线程cpu占比有些麻烦)redefine
加载外部class文件到应用程序中(VisualVM没有这个功能,插件市场貌似也没有找到相关插件)monitor
监测方法调用次数、成功次数、失败次数、平均RT等watch tt
观测方法执行的前、后、结束、异常、耗时过大时,入参(入参属性深度可调)、返回值、异常,支持实时监测每次方法执行和方法的全部调用执行。jad
反编译class文件(再也不须要从jar解压出来,再使用jad工具反编译了)sc sm
快速搜索类和方法信息getstatic
查看类静态变量(VisualVM只能看实例属性)sysprop
修改系统属性trace
查看方法调用树耗时,VisualVM也能够看,不过VisualVM感受更像是从全局来找某个线程的某个方法耗时,而Arthas可直接定位到某个方法进行观测,而且支持设置条件打印,如耗时超过某值、入参是某值时等等。stack
查看方法的全部调用树路径,一样,VisualVM其实也能看,不过仍然感受是全局找局部,而Arthas是局部方法直接定位,也一样支持设置条件,当耗时超过某值等才输出调用该方法的全部调用路径。总结一下就是:VisualVM和Arthas能够相辅相成,前者更像一个全局监测官,监控总体运做状况!然后者更像一个局部调试官,可监测方法,甚至可细化到方法执行先后的参数等,因此它更经常使用于调试排查
!bash
下面说一下我经常使用的基本命令:app
下面说一下我经常使用的基本参数:yii
经常使用表达式:ide
thread -n 3 //查看cpu占比前三的线程
thread -i 1000 //间隔
复制代码
redefine -p d://tmp/Test.class //加载指定位置的class文件
redefine -c 256a485d -p d://tmp/Test.class //让指定的classloader来加载,256a485d为该classloader的hashcode,可经过classloader命令来查得
复制代码
monitor -c 5 cn.localhost01.* check //统计周期5秒,默认120秒
复制代码
watch cn.localhost01.* check "params,reurnObj" -x 2 -b -s //同时检测方法调用先后的入参和返回值,参数和返回值的属性遍历深度为2,一共可支持设置 -b(调用前)、 -e(异常时)、-s(返回后)、-f(结束后)
watch cn.localhost01.* check "params,returnObj" "params[0].name.equals('abc')" -x 3 -b //知足条件才打印
watch cn.localhost01.* check "params,returnObj" #cost>200 -x 3 //知足条件才打印
复制代码
tt -t -n 20 cn.localhost01.* check
复制代码
记录了一段时间后,须要对一些方法进行查看:svn
tt -l //-list,查看全部记录的方法,结果集会展现出每一个方法的INDEX索引序号
复制代码
找出某个方法:
tt -s method.name="check" //-search,查看方法名为check的方法
复制代码
根据INDEX精肯定位到某个方法:
tt -i 1001 //-index,查看索引为1001的方法
复制代码
重作一个调用:
tt -i 1001 -p //-play,重执行
复制代码
jad cn.localhost01.demo.Checker
复制代码
sc cn.*.Checker //搜索类
sm *.Checker check //搜索方法
复制代码
getstatic *.Checker pool //注意,查不到常量
复制代码
sysprop java.version 1.7
复制代码
trace cn.loacalhost01.* check params.length==2 //查看含有两个参数的check方法调用树耗时
trace cn.loacalhost01.* check #cost>500 //查看耗时超过500毫秒的check方法调用树耗时
复制代码
stack cn.loacalhost01.* check params[0]==78 //查看第一个参数值为78的check方法调用树耗时
stack cn.loacalhost01.* check #cost>500 //查看耗时超过500毫秒的check方法调用树耗时
复制代码
由上可知,咱们会常常用到命令 classpath methodname
,而对于method,若是含有重载,若是区分要监测的具体是哪一个方法呢?
idea运行应用程序时,有时as.bat pid
打开后,检测的并非输入的pid,多是一个bug吧!