内容简介:Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:图上可以看到Arthas支持的命令,各个命令的具体使用可参见官方文档:这里为什么把Arthas这个东西拿出来说,是因为:尽管VisualVM已经在转储、监控、快照等方面做得很到位了,但是对于某些领域,它仍有不足!这时候,Arthas可以发挥一下它的优势。具体领域体现在:
先援引官方一段话:
Arthas 是Alibaba开源的 Java 诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- Arthas采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
然后上个图吧:
图上可以看到Arthas支持的命令,各个命令的具体使用可参见官方文档: alibaba.github.io/arthas。
这里为什么把Arthas这个东西拿出来说,是因为:尽管VisualVM已经在转储、监控、快照等方面做得很到位了,但是对于某些领域,它仍有不足!这时候,Arthas可以发挥一下它的优势。具体领域体现在:
-
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可以相辅相成,前者更像一个全局监测官,监控整体运作情况!而后者更像一个局部调试官,可监测方法,甚至可细化到方法执行前后的参数等,所以它更常用于 调试排查
!
基本命令和参数
下面说一下我常用的基本命令:
- help 查看命令帮助,eg:help getstatic
- cls 清屏
- quit 退出当前Arthas客户端
- shutdown 退出所有打开的Arthas客户端
下面说一下我常用的基本参数:
- -n 限制打印的条数,如程序执行中,可能有些方法会疯狂打印。
- -i 设置打印间隔时间,单位 毫秒
- -x 属性遍历深度,默认为 1 。
常用表达式:
- * 任意多个任意字符
- #cost 消耗的时间
查看线程cpu占比
thread -n 3 //查看cpu占比前三的线程 thread -i 1000 //间隔 复制代码
加载外部class
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 复制代码
记录了一段时间后,需要对一些方法进行查看:
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 ,如果含有重载,如果区分要监测的具体是哪个方法呢?- tt -t cn.localhost01.* check "params.length==2" //含有两个参数的方法
- tt -t cn.localhost01.* check "params[0] instanceof String" //第一个参数必须是String类型
- tt -t cn.localhost01.* check "params[1].password='123456'" //第二个参数值对象的password属性值为123456
-
idea运行应用程序时,有时
as.bat pid
打开后,检测的并不是输入的pid,可能是一个bug吧!
以上所述就是小编给大家介绍的《性能分析利器总结二《Arthas》》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- AS3.0 Profiler 性能分析利器
- Linux内核性能分析利器之trace-cmd和kernelshark
- React性能分析利器来了,妈妈再也不用担心我的React应用慢了
- 用 dotTrace 进行性能分析时,各种不同性能分析选项的含义和用途
- Golang 性能测试 (2) 性能分析
- 页面渲染:性能分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design Accessible Web Sites
Jeremy Sydik / Pragmatic Bookshelf / 2007-11-05 / USD 34.95
It's not a one-browser web anymore. You need to reach audiences that use cell phones, PDAs, game consoles, or other "alternative" browsers, as well as users with disabilities. Legal requirements for a......一起来看看 《Design Accessible Web Sites》 这本书的介绍吧!