1、Arathas 介绍
官方文档:https://arthas.aliyun.com/doc/
GitHub 地址:https://github.com/alibaba/arthas
Arthas 是一款开源在线 java 诊断工具,采用命令行交互模式,支持 web 端在线诊断。Arthas 可以进行方法粒度(包括 private 方法)的耗时检测,入参,返回值查看,变量设置等。可以部分的代替线上 debug 功能,方便我们进行问题的定位和诊断
让我们来看看官网是怎么介绍的:
当你遇到以下问题而束手无措时,Arthas 可以帮助你解决:
- 这个类从哪个 jar 包加载的,为什么会报各种类相关的 Exception
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状态?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定为到应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
大声说出我们的感受:牛逼!!!用过的人都说好~~~
2、Arthas 快速开始
2.1 Arthas 下载
下载及安装方式请看官方文档:
https://arthas.aliyun.com/doc/download.html
https://arthas.aliyun.com/doc/install-detail.html
Linux 环境下下载 arthas-boot.jar
wget https://alibaba.github.io/arthas/arthas-boot.jar
2.2 运行
下载下来是个 jar 包,我们可以直接运行
java -jar arthas-boot.jar
运行 jar 包后,控制台会显示所有的 java 进程,我们可以选择一个要诊断的进程
选择进程后,Arthas 会附到目标进程上,并输入日志。
3、Arthas 使用
先编写一个简单的测试项目运行起来,用 Arthas 进行问题的定位和解决
附上可运行代码 GitHub 地址:https://github.com/sunqingda/project/tree/arthas-test-project
项目打个 jar 包放到服务器上在后台运行
nohup java -jar arthas-test-project-1.0.0-SNAPSHOT.jar > server.log &
运行后可以正常访问:http://82.156.227.150:9000/query?id=2
3.1 Arthas 常用命令
下载并安装后,我们就可以开始我们的使用了。首先,让我们先看一下它的命令
看着非常的多,我们先来熟悉一下常用的命令
dashboard 全局监控
dashboard
命令用来显示当前系统的实时数据面板,概览程序的线程、内存、运行环境、GC 等
dashboard
thread 线程信息
thread
命令用来查看 JVM 的所有线程的堆栈信息
thread
thread -n 线程个数
命令可以打印最忙的指定个数线程的堆栈信息
thread -n 3
thread ID
命令用来查看指定 ID 线程的堆栈信息
thread 35
jad 反编译
可以使用
jad 类路径
命令反编译 class 文件,可以使用 tab 自动补全路径加上 --source-only 可以只显示源码
jad com.sqd.demo.service.TestServiceImpl --source-only
或者
jad 类路径 方法名
只编译某个方法
jad com.sqd.demo.service.TestServiceImpl queryEntityById
sm 查看方法
使用
sm 类名
查看类的方法信息
sm com.sqd.demo.service.TestServiceImpl
monitor 监控
使用
monitor 类名 方法名 --cycle 10
间隔10秒监控统计一次方法执行情况
monitor com.sqd.demo.controller.TestController queryEntityById -n 10 --cycle 10
watch 观察方法信息
使用
watch 类名 方法名 '参数类型'
监听方法执行入参和出参详细信息这个很实用,可以直接查看线上传递参数问题,进行方法排查
watch com.sqd.demo.controller.TestController queryEntityById '{params,returnObj,throwExp}' -n 5 -x 3
使用
stack 类名 方法名
观察方法的调用信息
stack com.sqd.demo.service.TestServiceImpl queryEntityById -n 5
基本的使用这些命令差不多了,其它更多的可以继续看官方文档学习 https://arthas.aliyun.com/doc/advanced-use.html