实战:利用 Arthas redefine 命令在不重启应用的情况下动态修复 JVM 中的 Bug 类

陌明大大_2424

陌明大大_2424

2026-05-05

1016人浏览

原创

redefine可动态修复线上bug,仅限修改方法体内部逻辑,适用于条件补漏、返回值修正、加日志、改硬编码;禁用类结构变更;五步完成:jad反编译→编辑→mc编译→redefine加载→watch验证。

实战:利用 arthas redefine 命令在不重启应用的情况下动态修复 jvm 中的 bug 类

能用 redefine 动态修复线上 Bug,前提是只改方法体内部逻辑,不碰类结构。它不是万能补丁,但对紧急边界判断错误、数值计算偏差、日志缺失这类问题,确实能做到“改完即生效”,整个过程不到两分钟。

确认是否适合热修复

redefine 只允许修改已有方法的字节码,以下情况才适用:

  • 条件分支补漏(比如 if (id 漏了 <code> 的校验)
  • 返回值修正(如误写 return true 应为 return false)
  • 临时加一行日志或埋点(log.debug("input: {}", param))
  • 硬编码值替换(如把 TIMEOUT_MS = 3000 改成 5000)

以下操作会直接失败,必须避免:

疯火轮AI
疯火轮AI

一款AI办公效率工具,主要用于营销人的AI工作台,适合需要提升相关任务效率的用户。

下载
  • 新增或删除字段、方法
  • 修改方法签名(参数类型、数量、返回值类型)
  • 给类加注解、改继承关系或实现接口
  • 改动 java.* 或 javax.* 等系统类

五步完成 redefine 热修复

整个流程围绕 jad → 编辑 → mc → redefine 展开,每步都有明确目标:

  • 反编译源码:执行 jad --source-only com.example.OrderService > /tmp/OrderService.java,拿到当前 JVM 正在运行的原始代码
  • 本地修改保存:用 vim 或其他编辑器打开文件,仅修改出问题的方法体,保存后确保无编译错误
  • 内存中编译:运行 mc -d /tmp /tmp/com/example/OrderService.java,生成标准 class 文件(路径需与包名严格一致)
  • 加载新字节码:执行 redefine /tmp/com/example/OrderService.class,JVM 即刻替换方法实现
  • 验证效果:用 watch com.example.OrderService checkCoupon returnObj 观察真实返回值,确认逻辑已生效

关键注意事项

redefine 看似简单,但几个细节决定成败:

  • 目标类必须由**同一个 ClassLoader** 加载,用 sc -d com.example.OrderService 查看 classLoaderHash,避免多加载器冲突
  • 修改前先备份原始 class:jad --no-source com.example.OrderService > /tmp/OrderService.class.bak,便于秒级回滚
  • 磁盘空间要预留至少 50MB,反编译和编译过程会产生临时文件
  • 若提示 redefine failed: java.lang.UnsupportedOperationException,大概率是类被 Spring CGLIB 增强过,可尝试先用 sm -d 确认实际生效的方法名

替代方案:retransform 更宽松但需额外准备

如果 redefine 失败,且你已提前用 arthas-agent 启动应用,可考虑 retransform:

  • 支持更宽泛的字节码变更(如部分 Lambda 表达式重写)
  • 需要预先通过 Instrumentation.addTransformer 注册转换器,普通 attach 模式不支持
  • 生产环境建议优先走 redefine 路径,它更轻量、更可控、无需预埋

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.26

313

5

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

2023.10.11

619

5

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

20

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

20

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

140

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
誉天教育RHCE视频教程
誉天教育RHCE视频教程

共9课时 | 1.7万人学习

尚观Linux RHCE视频教程(二)
尚观Linux RHCE视频教程(二)

共34课时 | 6.9万人学习

尚观RHCE视频教程(一)
尚观RHCE视频教程(一)

共28课时 | 5.8万人学习