生產環境應用伺服器(如 WebLogic 生產模式)不支援熱部署,業務邏輯變更往往需重啟。利用 JVMTI(透過 JDI 高層 API)可實現無重啟動態替換已載入類。
-Xdebug -Xrunjdwp:transport=dt_socket,address=9191,server=y,suspend=n,使用 VirtualMachine.attach() 連接。.class 文件轉為 byte[]。vm.classesByName(className)。vm.redefineClasses(Map<ReferenceType, byte[]>) 完成熱替換。public void reloadClasses(List<String> toReloads) {
Map<ReferenceType, byte[]> toReloadMap = new HashMap<>();
for (String className : toReloads) {
InputStream is = getClass().getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");
if (is == null) throw new RuntimeException("Class not found in classpath: " + className);
List<ReferenceType> refs = vm.classesByName(className);
if (refs.isEmpty()) throw new RuntimeException("Class not loaded in target JVM: " + className);
toReloadMap.put(refs.get(0), toByteArray(is));
}
if (!vm.canRedefineClasses()) throw new RuntimeException("Target VM does not support RedefineClasses");
vm.redefineClasses(toReloadMap);
}
canRedefineClasses() == true(部分 VM 實現受限)。VerifyError 或行為異常,建議低峰期操作。緊急修復線上 Bug(如邏輯判斷錯誤、參數校驗遺漏)、動態調整業務規則參數、AOP 切面注入臨時診斷代碼。非替代標準發布流程。