分布式系统中,java的线上项目能否使用classLoad等技术通过线上替换class文件实现热更新?

这种场景,我有一个spring boot 项目A打成jar包,部署在 a,b,c,d三台服务器中,现在发现项目A中一个class存在bug,设想是不重新发布代码,而是使用classload技术实现线上代码的替换来解决bug,问一下现在可以实现吗或者有成熟稳定方案实现吗

-------------------------------补充一下

spring boot 使用的是内嵌容器,不是打成war然后部署在tomcat等容器中而是可独立运行的jar包

阅读 3.8k
2 个回答

我记得Tomcat的热部署就是 检测class文件变动,就用classload 重新加载,和你的描述有点类似,但是我以前在使用的时候出现过永久区内存溢出的情况,当时分析的时候是这样:

tomcat设置为热部署状态 reload=‘true’可能会产生永久区的内存溢出,首先永久区存储的是类的class信息,日志报出的信息有CGLIB的报错信息,查了一下有说CGLIB的动态代理占用了大量的永久区,所以再加上tomcat reload时候旧的类信息没有办法gc就导致了永久区内存溢出。

为什么这么做?用docker集群不是更容易么,有bug,发布个新版本应该是持续发布,不需要停服务。远程加载class理论上可以,但是要自己写一个classloader,继承默认的classloader。在需要更新的时候让你的classloader下载class,然后加载上。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题