Java 代码热更方案

本文探讨了Java代码热更的方案,利用JVM的特性避免像静态语言那样需先编译再执行,适合有状态服务的bug修复和配置更新。介绍了JOOR和OpenHFT Java Runtime Compiler等工具,并给出了简单的流程图,以及Groovy的加载方式。
摘要由CSDN通过智能技术生成

由于 jvm just in time 和支持解释运行和过热代码编译的特性,所以无需像 c/c++ 这种纯静态语言,需要先编译再执行。jvm 系的语言是支持脚本执行,只要编译成 class 供 jvm 识别,即可执行,执行过热之后(HotSpot)再编译成机器码,从而提高开发和运行效率的。

代码热更方案应用场景
  • 有状态服务的代码替换或 bugFix
    因为应用程序中保存了用户的信息或上下文信息,重启应用会导致内存中的数据丢失,所以代码热更非常适合这种类型的服务。

比如提供与用户对话的服务,内存中保存了一些用户对话的上下文信息(存储在 NoSQL 需要额外的成本),如果做 bugFix, 但是没有实现代码热更,此时不得不停机重启服务,导致服务一段时间不可用,且丢失用户上下文信息。

  • 配置或业务代码热更
ShowCode
  • Java

需要 javac 编译器或其它支持编译 java 的编译器。以下为封装了 Javac 的开源工具及其实现热更代码

JOOR

OpenHFT Java Runtime Compiler

简要的流程图如下

流程图

import net.openhft.compiler.CompilerUtils;
import org.joor.Reflect;

import java.util.concurrent.TimeUnit;

public class TestCompiler {
   

    // 单例,持有 volatile 修饰的 runnable, 需要其他线程(例如:监听脚本变更的线程)替换引用
    public static TestCompiler testCompiler = new TestCompiler();

    // 假设为业务代码
    public volatile Runnable bizRunnable = () -> System.out.println(this.getClass().getSimpleName());

    static String className = "com.eahau.example.compiler.TestCompilerRunnable";
    static String sourceCode = "package com.eahau.example.compiler;\n" +
            "\n" +
            "public class TestCompilerRunnabl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值