1. Arthas 是什么?
摘自 Arthas 的 Github 介绍:
Arthas is a Java Diagnostic tool open sourced by Alibaba.
Arthas allows developers to troubleshoot production issues for Java applications without modifying code or restarting servers.
大意为:Arthas 是阿里开源的一个 Java 诊断工具,可以帮助开发人员在不修改代码或重启服务器的情况下快速定位线上问题。
听起来确实是我们的程序员的一大福利。比如,我们就遇到一种情况,Spring Boot 应用中有个 cron 定时任务为每天凌晨 1 点启动执行,但是测试起来很不方便,总不能每次修改 cron 时间来让 QC 测试吧?这样虽然是方便了测试妹子,但是却徒增了我们开发时间和迭代次数啊!!!那 Arthas 到底是否能够满足我们需求呢?Go on…
2. 开启 Arthas 之旅
2.1 安装 Arthas
- 方式 1:下载 arthas-boot.jar 包的方式
wget https://alibaba.github.io/arthas/arthas-boot.jar
此时在你当前所在目录下会有个 arthas-boot.jar
包。
尝试下 arthas:
# 启动 arthas,会进入命令行交互状态
java -jar arthas-boot.jar
# 查看 arthas 命令手册
java -jar arthas-boot.jar -h
- 方式 2:通过 as.sh 安装 Arthas(强烈推荐)
# 该命令会下载 as.sh 到当前目录下
curl -L https://alibaba.github.io/arthas/install.sh | sh
尝试下 arthas:
# 启动 arthas,会进入命令行交互状态
./as.sh
# 查看 arthas 命令手册
./as.sh -h
2.2 开始使用
下面演示我们以 as.sh
为主。
首先我们启动 arthas,会查看到我们当前 server 上部署的应用已经被探测到,当前我的 server 上只有一个应用程序,只需输入数字 1,即可和该应用进行交互:
2.2.1 基础命令
- 通过
dashboard
命令可以实时查看应用监控数据
- 通过
thread
命令查看应用程序中所有线程情况
其中第一列为线程的 ID。
-
通过
thread threadId
命令查看指定线程状态信息- 比如我们要查看线程 ID 为 506 的线程状态信息:
- 当然,因为是命令行交互,也是支持管道流式操作:
- 通过
watch
命令去查看方法的参数、返回值和异常信息 -
通过
sc
命令查看类的信息- 通过
sc yourFullClassName
- 通过
- 通过
sc -d yourFullClassName*
去查看 JVM 加载的类信息
- 通过
sc *yourClassName*
去查看 JVM 加载的类信息
-
通过
sm
命令查看类的方法信息- case 1:
sm java.math.RoundingMode
- case 1:
- case 2:
sm -d java.math.RoundingMode
- case 3:
sm java.math.RoundingMode <init>
2.2.2 重头戏命令
- 通过
jad yourFullClassName
去查看反编译后的完整代码信息 - 通过
jad --source-only yourFullClassName > /tmp/yourClassName.java
导出反编译代码到临时目录 - 通过
vim /tmp/yourClassName.java
进行编辑修改代码 - 通过
sc -d *yourClassName | grep classLoaderHash
获取加载 yourClassName 的类加载器 - 通过
mc -c classLoaderHash /tmp/yourClassName.java -d /tmp
重新用相同类加载器重新编译修改后的类(mc: Memory Compiler) - 通过
redefine /tmp/yourFullClassName.class
重新加载新的被编译的类文件
2.2.3 更多操作案例
请参考官方手册,了解更多操作案例和用法。
参考资料
- Arthas
- Arthas 使用手册