性能分析利器总结二《Arthas》

栏目: Java · 发布时间: 5年前

内容简介: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方法调用树耗时
复制代码

注意

  1. 由上可知,我们会经常用到 命令 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
  2. idea运行应用程序时,有时 as.bat pid 打开后,检测的并不是输入的pid,可能是一个bug吧!


以上所述就是小编给大家介绍的《性能分析利器总结二《Arthas》》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java从入门到精通

Java从入门到精通

魔乐科技MLDN软件实训中心 / 人民邮电出版社 / 2010-4 / 59.00元

《Java从入门到精通》主要内容涵盖Java应用程序的创建及语言特点,Java开发工具Eclipse的使用,类和对象,Java程序异常处理,Java多线程,Java网络程序设计和Java数据库编程等,并通过五子棋和人事管理系统的设计两大项目讲解Java实用操作。《Java从入门到精通》在DVD光盘中赠送了Java SE类库查询手册,Java程序员职业规划,Java开发经验及技巧大汇总等丰富资源,包......一起来看看 《Java从入门到精通》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具