![7873f8b1ce87947631de25e363aae400.png](https://i-blog.csdnimg.cn/blog_migrate/06daba318296554da7e45da37018eefc.jpeg)
之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器。都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单。如果你用 BTrace 的话,需要事先写好探测脚本,然后上传到需要排查问题的服务器,然后执行命令。比方说获取某个方法的参数、返回值、异常等。而 Athas 方便在不用写脚本,直接用命令行方式就可以,使用它就好像在用安装在服务器上的各种工具一样,比如 top、jps、jmap 等。
他们背后的逻辑都是字节码修改,如果你想了解,可以读一读这篇Java 调试工具、热部署、JVM 监控工具都用到了它
夸了半天,Arthas 到底有什么神奇的呢,有什么功效呢。以下是摘自官方的介绍。
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?
为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
看到上面的介绍是不是有种发现新大陆的感觉,恨不得拍拍大腿。心里在想,要是早知道它,之前就不用为了一个诡异的线上 bug 重复发包打日志了。
不管你现在用不用得上,都请记住它吧,相信我,迟早会用的上的。
安装与启动
先远程到目标服务器上,然后执行以下命令安装并运行
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
然后 Arthas 会列出当前服务器上的所有 Java 进程。
Arthas fengzheng$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.1
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 95301 org.kite.CmApplication
[2]: 95300 org.jetbrains.jps.cmdline.Launcher
[3]: 87737 org.kite.WdApplication
比如你想检查 org.kite.WdApplication 这个应用的问题,那么输入数字 3 回车,会出现如下提示,并开始正式与目标应用交互。
![0ea4f0fbea33e56588d1d38696be8c70.png](https://i-blog.csdnimg.cn/blog_migrate/8ccbbdd4ba6d52a37ebdbe54cbd8eae5.jpeg)
正式交互开始,就到了大展拳脚的时候了,线上出现的问题基本上都可以找到合适的命令。
下面简单的介绍几个,就是为了演示一下使用方式。
monitor
## 监控 MonitorController 类下的 overview 方法
monitor -c 5 kite.springcloud.jxm.controller.MonitorController overview
## 监控 kite.springcloud.jxm.service package 下所有了类的所有方法 *是通配符 也可以是正则表达式
monitor -c 60 kite.springcloud.jxm.service.* *
-c 为执行周期,默认120 秒,例如 -c 5 表示 5 秒钟输出一次,-c 60 表示 60 秒输出一次。
watch
## 方法执行前 打印参数
watch kite.springcloud.jxm.service.MonitorDashboardService buildJvmInfo "{params}" -b -n 1
## 方法返回后 打印返回值
watch kite.springcloud.jxm.service.MonitorDashboardService buildJvmInfo "{returnObj}" -s -n 1
## 方法返回后 打印所在的 ClassLoader、所在的类、调用实例
watch kite.springcloud.jxm.service.MonitorDashboardService buildJvmInfo "{loader,clazz,target}" -s -n 1
## 打印耗时超过 200ms 方法的参数和返回值
watch kite.springcloud.jxm.service.MonitorDashboardService * '{params, returnObj}' '#cost>200'
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
trace kite.springcloud.jxm.controller.MonitorController overview
# 多个类 模拟实现多穿链路 trace
trace -E kite.springcloud.jxm.controller.MonitorController|kite.springcloud.jxm.service.MonitorDashboardService overview
stack
输出当前方法被调用的调用路径
stack kite.springcloud.jxm.controller.MonitorController overview
stack kite.springcloud.jxm.service.MonitorDashboardService overview -n 1
详细的命令介绍直接看官方文档吧 。https://alibaba.github.io/arthas/quick-start.html
另外,无论是 Arthas 还是 BTrace ,都是用来排查单机服务问题的,也就是应用内部的代码、性能问题,如果要排查不同服务之间的调用问题,那就是另一个维度上的事儿了。就需要 APM 的帮助了。
同时,还可以读:
Java 调试工具、热部署、JVM 监控工具都用到了它mp.weixin.qq.com![e1866a4be9c86785cf689e7833874672.png](https://i-blog.csdnimg.cn/blog_migrate/414b1c07b297ef022bcf43e7ad096dff.jpeg)
![fdd6f96bafb0b4216c66221d0ed31bac.png](https://i-blog.csdnimg.cn/blog_migrate/5546fa891201917a7fea707a10588d5a.jpeg)
![59e7d50e1e7be47e817ccb0da5aa652b.png](https://i-blog.csdnimg.cn/blog_migrate/00894d48ee41a1b90db68df9f888de0f.jpeg)