笔者闲逛开源中国, 偶遇 "开源中国 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
image.PNG
3.2 选择需要查看的进程:
2
image.PNG
3.3 当前进程的信息, 按 ctrl+c 可以中断执行
dashboard
image.PNG
可以看到进程里运行中的线程, 内存, jvm 及 GC 信息.
四 牛逼闪闪的功能
4.1 jad 反编译指定已加载类的源码
命令: thread 1 查看线程信息, 找到类路径 demo.MathGame
image.PNG
反编译类: jad demo.MathGame
image.PNG
反编译指定函数:
jad demo.MathGame main
再也不用为了反编译代码, 从服务器拉下 jar 包找破解软件进行反编译了有没有...
4.2 方法执行数据观测
watch 可以观察到指定方法的调用情况. 能观察到的范围为: 返回值, 抛出异常, 入参, 通过编写 OGNL 表达式进行对应变量的查看.
观察方法出参和返回值:
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
image.PNG
4.3 redefine
加载外部的. class 文件, redefine jvm 已加载的类
该功能可以使得在不替换 jar 和重启的情况下, 通过替换需要的 class 文件来实现调试, 比如追加日志.
关于该功能的使用, Arthas 实践 -- 使用 redefine 排查应用奇怪的日志来源 https://github.com/alibaba/arthas/issues/263 的讲述颇为直观, 可参考之.
4.5 除上述外还有 trace 命令可以查看方法内部调用路径, 并输出方法路径上的每个节点上耗时; sc 命令查看 JVM 已加载的类信息等等, 诸君可细细把玩, 盘它或有受益.
来源: http://www.jianshu.com/p/1f21ef4ee57b