这种场景,我有一个spring boot 项目A打成jar包,部署在 a,b,c,d三台服务器中,现在发现项目A中一个class存在bug,设想是不重新发布代码,而是使用classload技术实现线上代码的替换来解决bug,问一下现在可以实现吗或者有成熟稳定方案实现吗
-------------------------------补充一下
spring boot 使用的是内嵌容器,不是打成war然后部署在tomcat等容器中而是可独立运行的jar包
这种场景,我有一个spring boot 项目A打成jar包,部署在 a,b,c,d三台服务器中,现在发现项目A中一个class存在bug,设想是不重新发布代码,而是使用classload技术实现线上代码的替换来解决bug,问一下现在可以实现吗或者有成熟稳定方案实现吗
-------------------------------补充一下
spring boot 使用的是内嵌容器,不是打成war然后部署在tomcat等容器中而是可独立运行的jar包
为什么这么做?用docker集群不是更容易么,有bug,发布个新版本应该是持续发布,不需要停服务。远程加载class理论上可以,但是要自己写一个classloader,继承默认的classloader。在需要更新的时候让你的classloader下载class,然后加载上。
4 回答1.2k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答704 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.6k 阅读
2 回答1.3k 阅读
我记得Tomcat的热部署就是 检测class文件变动,就用classload 重新加载,和你的描述有点类似,但是我以前在使用的时候出现过永久区内存溢出的情况,当时分析的时候是这样:
tomcat设置为热部署状态 reload=‘true’可能会产生永久区的内存溢出,首先永久区存储的是类的class信息,日志报出的信息有CGLIB的报错信息,查了一下有说CGLIB的动态代理占用了大量的永久区,所以再加上tomcat reload时候旧的类信息没有办法gc就导致了永久区内存溢出。