文章目录
前言
Arthas 是什么?
Arthas
(阿尔萨斯)是Alibaba开源的Java诊断工具,深受开发者喜爱。
Arthas 能够做什么?
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
安装
前面说了 Arthas
是阿里开源的 Java 诊断工具,所以它是一个项目,可以打成 jar 包部署在服务器运行。
下面我就以 window 上运行 jar 包为例进行演示。
(安装我们就省略,直接从官网下载 jar 包进行使用即可)
Linux 安装可以参考官网:https://arthas.aliyun.com/doc/install-detail.html
初步使用
启动正常 Java 项目
命令:$ java -jar xxx.jar
启动 Arthas 服务
$ java -jar arthas-boot.jar
可以看到我们启动的 demo-test.jar
Java 项目,前面有个 index
标识 4;所以我们输入 4 + Enter 即可指向我们要操作的项目。
启动成功,arthas
提供一个web操作界面,在游览器地址栏输入:127.0.0.1:3658
即可打开。
至此,我们准备工作就已完成,接下来我们就在这个 Web 界面进行命令操作。
Arthas 追加日志案例
基础命令
help 查看帮助命令
可以看到,Arthas
提供的命令非常多,功能也非常强大;可以对 JVM 的运行进行管理、可以查看 stack 虚拟机栈等等。
jad 反编译
使用这个命令能够将 .class
字节码文件,反编译成我们源代码;一般用于查看 JVM 加载执行的类,是否是我们所期望的类。
命令:jad 类全路径类名
如:jad com.cqeec.demo.controller.DemoController
可以看出,我们在代码中 System.out.println("--111--")
这段话,那我们在游览器进行请求这个控制方法。
http://localhost:12323/demo/test
已经输出成功。
那假如我们在线项目出了错,但是这个项目是正式环境运行着的项目,不能停,但是我怀疑变量的数据有问题,所以需要修改代码追加日志怎么办?
能够想到的就是本地修改源代码,追加日志,然后重新发版;这样太繁琐了,所以 Arthas
就是来干这个事儿的。—— 在不停止项目的情况下,手动替换 JVM 中的 .Class
文件,达到修改代码的功能。
retransform 替换 Class 文件
作用:加载外部的.class
文件,retransform(重新转换) jvm已加载的类。
-
首先需要准备一个修改代码后的
.Class
文件。@GetMapping("/test") public void test() { // 原先代码给注释掉 // System.out.println("---------111----------"); // 新增代码 String name = "zhangSan"; System.out.println(name); }
-
利用 IDEA 将修改后的
.java
文件编译为字节码文件 -
使用
retransform
命令进行字节码文件的替换寻找编译后的字节码文件
替换操作说明
命令:
$ retransform 编译后的字节码文件地址
例如:
$ retransform D:/code/demo-test/target/classes/com/cqeec/demo/controller/DemoController.class
注意:必须是正斜杠才能识别。
-
执行命令
成功,我们再次游览器启动控制方法,看输出结果是否为
zhangSan
。成功! (注意我们全程没有重启 demo-test.jar 服务)
以上我们追加日志就成功了。
恢复(消除影响)
-
删除指定 retransform entry(条目)
-
查看
Class
更换 entry$ retransform -l
这个是小写的L
-
删除 entry
单个删除:
$ retransform -d 1 (1:代表 entryID)
删除全部:
$ retransform --deleteAll
-
-
显式触发 retransform
删除所有 entry 之后,重新加载被修改的类
命令:
$ retransform --classPattern 类的全路径类名
再次游览器请求,查看输出结果。
恢复了!
以上就是追加日志的全过程!
Arthas 整合 Spring Boot
只支持 spring boot 2
maven 依赖
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
配置属性
# arthas配置
arthas:
# arthas连接ID
agent-id: demo-test
# atthas 服务连接地址
tunnel-server: ws://127.0.0.1:7777/ws
默认情况下,arthas tunnel server的web端口是8080
,arthas agent连接的端口是7777
下载部署arthas tunnel server
从Github Releases页下载: https://github.com/alibaba/arthas/releases
下载后直接启动:$ java -jar arthas-tunnel-server-3.5.1-fatjar.jar
启动项目,连接到 Arthas
这里就直接使用 IDEA 启动了(要达成 jar 包启动也可以的)
项目启动后,打开 Arthas
提供的 Web 界面:http://127.0.0.1:8080/,使用项目中配置的 agent-id
,将 Arthas
连接到服务。
连接成功。
这样我们只需要在服务器部署一个 arthas-tunnel-server-3.5.1-fatjar.jar
,就可以很方便的支持多个 Java 服务的 Arthas
调试了。
自此,使用 Arthas
追加日志就已经实现;Arthas
还有很多强大之处,慢慢探索!
技术来源于生活!