Java热更新与JReloader、ASM

  1. Java Agent原理
  2. JReloader
    1. 限制:
    2. 使用方法:
  3. JRebel
  4. ASM,Java字节码操控框架
  5. java.lang.instrument.Instrumentation
  6. BTrace
  7. arthas
  8. jvm-sandbox

Java Agent原理

[JVM源码分析之javaagent原理完全解读]

JReloader

JReloader 是一个用来重新加载class文件而无需重启JVM的工具。

限制:

只能重新加载方法体的更改。不允许更改类签名。

如果您需要更多的灵活性,例如添加和删除方法的能力,JRebel 是一个不错的选择。虽然不是免费的,但可能物有所值。

使用方法:

You need only to add a couple of vm arguments, as in the example below:

java -noverify -javaagent:c:\tools\jreloader.jar -Djreloader.dirs=c:\project\target\classes com.foo.Main

or

java -noverify -javaagent:c:\tools\jreloader.jar -Djreloader.dirs=c:\project\target\classes -jar foo.jar

If you have multiple modules, you can add more than one class dir:

    -Djreloader.dirs=c:\project\target\classes,c:\project2\target\classes,c:\project2\target\classes

参考:
[Google Code: JReloader]
[用 JReloader 动态重新加载改变的类而不用重启 JVM]

JRebel

[使用MyJRebel获取免费的JRebel授权]

ASM,Java字节码操控框架

ASM是一个全功能Java字节码操作与分析框架。可以用来修改已有的 class 文件或者直接以二进制形式动态生成 class。它提供了通用转换与分析算法,自己组合复杂转换与代码分析工具。

虽然提供了与其他字节码框架类似的功能,但是ASM主要专注于操作的易用性。它的设计目标就是更加小巧和快速,更适用于动态系统(*)。

ASM 修改字节码文件的流程是一个责任链模式,首先使用一个 ClassReader 读入字节码,然后利用 ClassVisitor 做个性化的修改,最后利用 ClassWriter 输出修改后的字节码.

由于HTTP服务是无状态的,所以在JSP中可以通过创建新的ClassLoader实例来加载新编译的Servlet类接替旧的class,但是对于其他的应用,由于对象大多是单例,对于内存中已经创建好的对象,我们无法通过创建新的ClassLoader的方式来修改对象的行为。

java.lang.instrument.Instrumentation

Oracle官方文档:https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

Instrumentation有两个接口,redefineClassesretransformClasses。一个是重新定义class,一个是修改class。redefineClasses是自己提供字节码文件替换掉已存在的class文件,retransformClasses是在已存在的字节码文件上修改后再替换它。

Instrument重定义和修改class都可能会改变方法体、常量池和属性。因此重定义和修改都不能添加、删除或重命名字段或方法,不能修改方法签名(参数类型及数量)或修改类的继承。 基本只能用来修改一个方法的内部逻辑(增删改一些条件判断之类的)

BTrace

BTrace是基于Java语言的一个安全的、可提供动态追踪服务的工具。BTrace基于ASM、Java Attach Api、Instruments开发,为用户提供了很多注解。依靠这些注解,我们可以编写BTrace脚本(简单的Java代码)达到我们想要的效果,而不必深陷于ASM对字节码的操作中不可自拔。

https://github.com/btraceio/btrace

arthas

阿里巴巴开源的Java诊断工具,一款功能全面且强大的工具平台,可用于在线排查问题和热修复线上代码,原理同上。

https://github.com/alibaba/arthas/blob/master/README_CN.md

文档:https://alibaba.github.io/arthas/

jvm-sandbox

一款JVM底层中台,让更多的人可以很轻松的去实现字节码增强相关的工具。
https://github.com/alibaba/jvm-sandbox

参考:
[ASM:通用底层字节码操作和分析开发库]
[IBM:深入探索 Java 热部署]
[JRebel与热部署与asm]
[美团热更方案ASM实践]
[阿里云:Java字节码修改框架ASM]
[Java动态追踪技术探究_美团]
[解密阿里线上问题诊断工具Arthas和jvm-sandbox]
[阿里巴巴Arthas实践–jad/mc/redefine线上热更新一条龙]
[阿里内部的那个牛逼带闪电的Java诊断工具终于开源了]


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 using1174@foxmail.com

文章标题: Java热更新与JReloader、ASM

文章字数: 1,005

本文作者: Jun

发布时间: 2018-07-27, 19:31:00

最后更新: 2021-06-27, 21:01:52

原始链接: http://yoursite.com/2018/07/27/ASM框架与Java热更新/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏