笔者闲逛开源中国,偶遇“开源中国 2018 年度榜单之国产新秀榜”之top1-Arthas,遂观之。阅后兴奋不已,此乃上古神器也。神器流落凡间,岂可枉顾之?盘它。。。
一 Arthas 何许神器?
神器铸造者如是说:
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
呐尼?如是而言,生产环境的问题岂非暴露无遗?再也不用为了定位生产环境问题而抓耳挠腮?不用再为了加个日志而打包上线重启?so crazy!
二 Arthas安装篇
wget https://alibaba.github.io/arthas/arthas-boot.jar
下载
执行:java -jar arthas-boot.jar
简单到想哭 有木有。
(ps:如果使用高大上的mac,可以使用homebrew安装wget后安装。)
当然想要全量下载安装也是可以的 arthas下载
三 小试牛刀
3.1启动arthas:
java -jar arthas-boot.jar
3.2选择需要查看的进程:
2
3.3当前进程的信息,按ctrl+c可以中断执行
dashboard
可以看到进程里运行中的线程,内存、jvm及GC信息。
四 牛逼闪闪的功能
4.1 jad反编译指定已加载类的源码
命令:thread 1
查看线程信息,找到类路径demo.MathGame
反编译类:jad demo.MathGame
反编译指定函数:
jad demo.MathGame main
再也不用为了反编译代码,从服务器拉下jar包找破解软件进行反编译了有没有。。。
4.2 方法执行数据观测
watch可以观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
观察方法出参和返回值:
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
4.3 redefine
加载外部的.class文件,redefine jvm已加载的类
该功能可以使得在不替换jar和重启的情况下,通过替换需要的class文件来实现调试,比如追加日志。
关于该功能的使用,Arthas实践--使用redefine排查应用奇怪的日志来源的讲述颇为直观,可参考之。
4.5除上述外还有trace命令可以查看方法内部调用路径,并输出方法路径上的每个节点上耗时;sc命令查看JVM已加载的类信息等等,诸君可细细把玩,盘它或有受益。