开发期热替换(HotSwap、DCEVM、HotSwapAgent)
背景 开发时希望改 Java 代码后 少重启 就能看到效果。这与生产上 BTrace attach 观测 不是同一条路。本文归纳 HotSwap 及相关工具,并说明各自边界。 字节码织入与 redefine 机制见 java-asm;调试协议见 JPDA、JVMTI。 HotSwap 是什么 HotSwap(热替换)泛指:不重启整个 JVM,把 已在内存中的类 换成新字节码。 HotSpot 自带 的热替换能力很窄(通过 调试器 触发,底层 JVMTI / redefine): 常见成功:改 已有方法的方法体 常见失败:新增方法/字段、改签名、改继承、新 import 等 因此 IDE 在 Debug 下保存后提示 “Hot swap” 成功或失败,依赖的是 JPDA → JDWP → JVMTI,不是 Attach API 加载 BTrace agent 那条栈。 开发期 HotSwap(典型) IDE 编译 .class → JDWP 命令 → JVM redefine 已加载类 生产期 BTrace(对比) loadAgent → Instrumentation + ASM retransform → 插探针(观测) 几种开发期方案 方案 怎么做 能力边界 IDE HotSwap Debug + JPDA 方法体为主,标准 HotSpot 最严 JRebel 商业 agent 类加载/字节码策略更激进,需授权 DCEVM 替换/并行使用 修改版 HotSpot(-XXaltjvm=dcevm) 放宽 redefine:可加删方法/字段等 HotSwapAgent -javaagent:hotswapagent.jar + 常配合 DCEVM 用 Javassist 改字节码;插件重载 Spring/Hibernate 等配置 Spring Boot DevTools 双 ClassLoader 快速 Restart 重建 Spring 上下文,不是 JVM 级 HotSwap Spring DevTools 细节见 Spring Boot DevTools。 ...