Java class文件热加载

238 阅读2分钟

平时开发过程中很少用到class热加载,在本地开发过程中,IDE配置一下就OK。可能用到的地方可能就是线上部署的代码无法重启,但又需要更新部分代码到线上的情况。
这种方式如果线上可以安装阿里的arthas的话,通过arthas 的retransform和redefine命令就能动态把修改的class替换掉而不用重启Java进程。
retransform和redefine是有一定的限制的:

  • 不允许新增加field/method
  • 正在跑的函数,没有退出不能生效
    这个限制可以通过DCEVM部分解决。(Dynamic Code Evolution VM)主要是解决Java HotSpot VM在运行期加载class的问题,有兴趣可以自己看看。

如果你在开发过程中有以下的场景,可以考虑以下GitHub上的这个项目,试用过对我来说确实能节省很多时间,因为我们在集成测试的过程中经常有频繁的小改动,因为集成包就是运维给客户的安装包,不是Jenkins开发测试环境,可能修改一下代码只要2-3分钟,但替换修改文件+重启一次服务器基本要5-10分钟。典型的一下场景:
小明: 小张,我这个接口开发好了,在测试环境部署好了,你调用下吧。
小张: 小明,这个请求结果不对,bla bla bla
小明: 不应该呀,我查一查。哎呀看不出来,要是这里有日志就好了,我加个日志重新部署下吧。小明开始修改代码,本地打包3分钟,上传测试机1分钟,测试机服务重新启动5分钟。
小明: 哎呀,原来是这里判断写反了,我修改下重新部署下。十分钟过去了...哎呀,那里又错了,我修改下。又十分钟过去了...
转眼晚上11点多了,小张已经不耐烦提前下班了。
小明: 要是能修改完代码在测试环境立马生效就好了,今天就能早点下班了

GitHub地址: github.com/liuzhengyan… 主要是能把本地修改的文件在idea中直接通过插件的方式更新到服务器,有兴趣的小伙伴可以去看看。