校园网站设计,免费论坛申请网站,交换链接营销成功案例,wordpress 如何 删除授权Arthas#xff08;阿尔萨斯#xff09;是 Alibaba 开源的一款 Java 诊断工具#xff0c;使用它我们可以监控和排查 Java 程序#xff0c;然而它还提供了非常实用的 Java 热更新功能。所谓的 Java 热更新是指在不重启项目的情况下实现代码的更新与替换。使用它可以实现不停机… Arthas阿尔萨斯是 Alibaba 开源的一款 Java 诊断工具使用它我们可以监控和排查 Java 程序然而它还提供了非常实用的 Java 热更新功能。所谓的 Java 热更新是指在不重启项目的情况下实现代码的更新与替换。使用它可以实现不停机更新 Java 程序尤其是对那些启动非常耗时的 Java 项目来说更是效果显著。Arthas 的使用其实非常简单它为我们提供了一个 Jar 包我们只需要把这个 Jar 下载到本地然后运行这个 Jar 包就可以正常使用它的功能了。Arthas 功能简述当你遇到以下类似问题而束手无策时Arthas 可以帮助你解决来自官方这个类从哪个 jar 包加载的为什么会报各种类相关的 Exception我改的代码为什么没有执行到难道是我没 commit分支搞错了遇到问题无法在线上 debug难道只能通过加日志再重新发布吗线上遇到某个用户的数据处理有问题但线上同样无法 debug线下无法重现是否有一个全局视角来查看系统的运行状况有什么办法可以监控到JVM的实时运行状态怎么快速定位应用的热点生成火焰图Arthas 支持 JDK 6支持 Linux/Mac/Winodws它采用命令行交互模式同时提供丰富的 Tab 自动补全功能进一步方便进行问题的定位和诊断。Arthas 使用Arthas 的使用步骤如下。步骤一下载 Arthas首先我们先把 Arthas 的 Jar 包下载到本地它的下载地址是https://alibaba.github.io/arthas/arthas-boot.jar步骤二启动 Arthas我们只需要使用普通的 jar 包启动命令java -jar arthas-boot.jar 来启动 Arthas 即可启动成功之后的运行界面如下如上图所示则表示 Arthas 启动成功。小贴士当我们运行 java -jar arthas-boot.jar 命令时首先需要先切换目录至该 jar 包的位置才能正常的启动 Arthas。步骤三运行 Arthas当我们启动完 Arthas 之后根据上图的提示我们需要选择一个要调试的 Java 进程例如我们输入“4”来监测我自己写的一个 Java 测试程序执行结果如下当出现 Arthas 的 logo 之后表示 Arthas 正常加载了 Java 进程。步骤四操作 Arthas当 Arthas 加载 Java 进程成功之后我们就可以输入相关的命令来查看相关的信息了。假如我们把本地环境视为生产服务器我们此时需要查看某个运行的 Java 程序是否为最新版的。在没有 Arthas 之前我们通常的步骤是这样的找到相应的 jar 包或者 war 包将 jar 包或者 war 包下载到本地找出相应的类进行解压操作然后将解压的 class 文件拖拽到 Java 编译器Idea 或 Eclipse中查看是否为最新的代码。但如果使用的是 Arthas那么我们就可以直接通过反编译命令将字节码编译为正常的 Java 代码然后再确认是否为最新的代码即可。我们只需要执行 jad 命令即可实现示例如下这样我们就可以直接来查看这个发布的程序是否为最新版本了。不仅如此我们还可以使用 Arthas 来监测整个程序的运行情况如下图所示我们还可以用 Arthas 来查看一些 JVM 的相关信息如下图所示更多 Arthas 的功能请访问https://alibaba.github.io/arthas/commands.html热更新 Java 代码假如我们原来的代码是这样的package com.example;import java.util.concurrent.TimeUnit;public class App {public static void main(String[] args) throws InterruptedException {while (true) { // 每两秒钟打印一条信息TimeUnit.SECONDS.sleep(3);sayHi();}}private static void sayHi() {// 需要修改的标识boolean flag true;if (flag) {System.out.println(Hello,Java.);} else {System.out.println(Hello,Java中文社群.);}}
}
我们现在想要把 flag 变量改为 false 就可以这样来做使用 Arthas 的内存编译工具将新的 Java 代码编译为字节码使用 Arthas 的 redefine 命令实现热更新。1.编译字节码首先我们需要将新的 Java 代码编译为字节码我们可以通过 Arthas 提供的 mc 命令实现mc 是 Memory Compiler内存编译器的缩写。实现示例如下[arthas3478]$ mc /Users/admin/Desktop/App.java -d /Users/admin/Desktop
Memory compiler output:
/Users/admin/Desktop/com/example/App.class
Affect(row-cnt:1) cost in 390 ms.
其中 -d 表示编译文件的存放位置。小贴士我们也可以使用 javac App.java 生成的字节码它与此步骤执行的结果相同。2.执行热更新有了字节码文件之后我们就可以使用 redefine 命令来实现热更新了实现示例如下[arthas51787]$ redefine /Users/admin/Desktop/com/example/App.class
redefine success, size: 1
从上述结果可以看出热更新执行成功此时我们去控制台查看执行结果如下图所示这说明热更新执行确实成功了。Arthas 热更新注意事项使用热更新功能有一些条件限制我们只能用它来修改方法内部的一些业务代码如果我们出现了以下任意一种情况那么热更新就会执行失败增加类属性类字段增加或删除方法替换正在运行的方法。最后一条我们需要单独说明一下假如我们把上面的示例改为如下代码package com.example;import java.util.concurrent.TimeUnit;public class App {public static void main(String[] args) throws InterruptedException {while (true) { // 每两秒钟打印一条信息TimeUnit.SECONDS.sleep(3);boolean flag true;if (flag) {System.out.println(Hello,Java.);} else {System.out.println(Hello,Java中文社群.);}}}
}
那么此时我们再进行热更新操作修改 flag 的值那么就会执行失败因为我们替换的是正在运行中的方法而我们正常示例中的代码之所以能成功是因为我们在 while 无线循环中调用了另一个方法而那个方法是被间歇性使用的因此可以替换成功。总结本文我们讲了 Arthas 的概念以及具体的使用流程Arthas 其实就是一个普通的 Java 程序我们可以使用 java -jar arthas-boot.jar 来启动它然后再选择我们要操作的 Java 进程这样就可以实现状态监控和其他操作。文章的后半部分我们介绍了 Arthas 的热更新功能而热更新本质上只需要使用一个 redefine 命令来加载新的字节码文件就可以实现热更新了但需要注意热更新不能替换正在运行的方法它只能修改方法内部的业务代码如果修改了类字段或者是更改了类方法那么热更新就会执行失败。最后的话原创不易斥资找人画了漫画看着老王认真的份上点个「在看」再走呗这是对我最大的支持与鼓励谢谢往期推荐
我写了10年博客却被人说“不火”我是这样怼回去的链表竟然比数组慢了1000多倍(动图性能评测)关注下方二维码每一天都有干货点亮“在看”助我写出更多好文