漫画:Java如何实现热更新?(下)

简介: 漫画:Java如何实现热更新?


热更新 Java 代码


image.png


image.png


假如我们原来的代码是这样的:


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 就可以这样来做:


  1. 使用 Arthas 的内存编译工具将新的 Java 代码编译为字节码;
  2. 使用 Arthas 的 redefine 命令实现热更新。


1.编译字节码


首先,我们需要将新的 Java 代码编译为字节码,我们可以通过 Arthas 提供的 mc 命令实现,mc 是 Memory Compiler(内存编译器)的缩写。


实现示例如下:


[arthas@3478]$ 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 命令来实现热更新了,实现示例如下:


[arthas@51787]$ redefine /Users/admin/Desktop/com/example/App.class
redefine success, size: 1


从上述结果可以看出,热更新执行成功,此时我们去控制台查看执行结果,如下图所示:


image.png


这说明热更新执行确实成功了。


Arthas 热更新注意事项


使用热更新功能有一些条件限制,我们只能用它来修改方法内部的一些业务代码,如果我们出现了以下任意一种情况,那么热更新就会执行失败:


  1. 增加类属性(类字段);
  2. 增加或删除方法;
  3. 替换正在运行的方法。


最后一条我们需要单独说明一下,假如我们把上面的示例改为如下代码:


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 命令来加载新的字节码文件就可以实现热更新了,但需要注意热更新不能替换正在运行的方法,它只能修改方法内部的业务代码,如果修改了类字段或者是更改了类方法,那么热更新就会执行失败。

相关文章
|
数据安全/隐私保护
基于SpringBoot+Vue+Java 的漫画之家系统(二)
基于SpringBoot+Vue+Java 的漫画之家系统
|
5月前
|
前端开发 JavaScript Java
计算机Java项目|基于Springboot的漫画网站
计算机Java项目|基于Springboot的漫画网站
|
5月前
|
安全 Java 定位技术
Java类加载大冒险,谁能将它变成漫画
Java类加载大冒险,谁能将它变成漫画
26 0
|
6月前
|
JavaScript Java 数据库
java漫画网站
漫画网站的角色分为管理员和用户。 管理员:管理员使用本系统涉到的功能主要有:首页、个人中心、用户管理、漫画分类管理、漫画投稿管理、分类管理、排行榜管理、交流论坛、系统管理等功能。 用户:用户使用本系统涉到的功能主要有:首页、个人中心、,漫画投稿管理等功能。
|
6月前
|
JavaScript Java 测试技术
基于Java的漫画阅读系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的漫画阅读系统的设计与实现(源码+lw+部署文档+讲解等)
87 2
|
数据安全/隐私保护 索引
基于SpringBoot+Vue+Java 的漫画之家系统(三)
基于SpringBoot+Vue+Java 的漫画之家系统
|
存储 Java 关系型数据库
基于SpringBoot+Vue+Java 的漫画之家系统(一)
基于SpringBoot+Vue+Java 的漫画之家系统
|
Java
推荐IntelliJ IDEA插件JRebel,支持Java项目热更新,省去不断重启服务的烦恼
推荐IntelliJ IDEA插件JRebel,支持Java项目热更新,省去不断重启服务的烦恼
722 0
推荐IntelliJ IDEA插件JRebel,支持Java项目热更新,省去不断重启服务的烦恼
|
安全 Java 程序员
漫画 | Java多线程与并发(二)
漫画 | Java多线程与并发(二)
153 0
漫画 | Java多线程与并发(二)
|
Java
漫画 | Java多线程与并发(一)
漫画 | Java多线程与并发(一)
145 0
漫画 | Java多线程与并发(一)