写点什么

Arthas redefine(加载外部的.class 文件,redefine 到 JVM 里 )

作者:刘大猫
  • 2025-04-27
    黑龙江
  • 本文字数:1490 字

    阅读完需:约 5 分钟


@[toc]

二、命令列表

2.2 class/classloader 相关命令

2.2.3 redefine(加载外部的.class 文件,redefine 到 JVM 里 )

提示:

目的:常用来解决线上服务不停止,修改代码操作

注意点1:redefine 的 class 不能修改、添加、删除类的 field 和 method,包括方法参数、方法名称及返回值。注意点2:如果 mc 失败,可以在本地开发环境编译好 class 文件,上传到目标系统,使用 redefine 热加载 class

注意点3:目前 redefine 和 watch/trace/jad/tt 等命令冲突,以后重新实现 redefine 功能会解决此问题

注意点4:redefine 后的原来的类不能恢复,redefine 有可能失败(比如增加了新的 field),参考 jdk 本身的文档。

注意点5reset命令对redefine的类无效。如果想重置,需要redefine原始的字节码。

注意点6redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置。 原因是 jdk 本身 redefine 和 Retransform 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。


参数说明:


举例 1:加载新的代码,jad/mc 命令使用

# 1、使用jad反编译 demo.MathGame 输出到 /opt/MathGame.javajad --source-only demo.MathGame > /opt/MathGame.java# 2、把上一步反编译的代码修改完成后,使用mc在内存中对新的代码进行编译mc /opt/MathGame.java -d /opt# 3、使用redefine命令加载新的字节码redefine /opt/demo/MathGame.class
复制代码

举例 2:上传 .class 文件到服务器的技巧

使用mc命令来编译jad的反编译的代码有可能失败。可以在本地修改代码,编译好后再上传到服务器上。有的服务器不允许直接上传文件,可以使用base64命令来绕过。


  1. 在本地先转换.class文件为 base64,再保存为 result.txt


   base64 < Test.class > result.txt
复制代码


  1. 到服务器上,新建并编辑result.txt,复制本地的内容,粘贴再保存

  2. 把服务器上的 result.txt还原为.class


   base64 -d < result.txt > Test.class
复制代码


  1. 用 md5 命令计算哈希值,校验是否一致

本人其他相关文章链接

1.Arthas 全攻略:让调试变得简单2.Arthas dashboard(当前系统的实时数据面板)3.Arthas thread(查看当前JVM的线程堆栈信息)4.Arthas jvm(查看当前JVM的信息)5.Arthas sysprop(查看和修改JVM的系统属性)6.Arthas sysenv(查看JVM的环境变量)7.Arthas vmoption(查看和修改 JVM里诊断相关的option)8.Arthas getstatic(查看类的静态属性 )9.Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)10.Arthas logger(查看 logger 信息,更新 logger level)11.Arthas mbean(查看 Mbean 的信息)12.Arthas memory(查看 JVM 内存信息)13.Arthas ognl(执行ognl表达式)14.Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)15.Arthas vmtool(从 jvm 里查询对象,执行 forceGc)16.Arthas jad(字节码文件反编译成源代码 )17.Arthas mc(Memory Compiler/内存编译器 )18.Arthas redefine(加载外部的.class文件,redefine到JVM里 )19.Arthas classloader (查看 classloader 的继承树,urls,类加载信息)20.Arthas sc(查看JVM已加载的类信息 )21.Arthas sm(查看已加载类的方法信息 )22.Arthas monitor(方法执行监控)23.Arthas stack (输出当前方法被调用的调用路径)24.Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)25.Arthas tt(方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测)26.Arthas watch (方法执行数据观测)27.Arthas profiler(使用async-profiler对应用采样,生成火焰图)

用户头像

刘大猫

关注

还未添加个人签名 2022-08-23 加入

还未添加个人简介

评论

发布
暂无评论
Arthas redefine(加载外部的.class文件,redefine到JVM里 )_人工智能_刘大猫_InfoQ写作社区