spring boot + embed tomcat + standalone jar的内存泄露问题 蔚落 2021-09-17 13:44 164阅读 0赞 前一阵遇到了一个很坑的内存泄露问题,记录于此: 有个项目采用spring cloud重构后,部署到线上(其中有一个接口,大概每天调用量在1千万次左右),发现zabbix监控里,linux的可用内存一直持续下降,每次重启后,大概能撑1天,就算业务高峰过去了,内存也不见回收,曲线图如下: ![点击看原图][27612-20171130234208570-1150757547.png] 发生故障时,用top -m 看java进程占用的内存并不算高,而且spring boot的acurator端点监控,以及jvm的内存监控都在正常值范围内,刚开始怀疑是jvm参数设置不合理,调整了G1垃圾收集器各种参数组合,没有明显效果,然后尝试换回CMS收集器,再折腾了几天,仍然如此。用dump导出来分析,线程数、大对象啥的都不高,遂怀疑是spring cloud的坑。 攀墙出去google了下,无意搜索" spring boot memory leak",发现有些人遇到了类似的问题,共同点都是embed tomcat + standalone jar运行方式,于是怀着试一试的心理,把容器换成了undertow,居然稳定了! ![点击看原图][27612-20171130234927742-1500855275.png] 附,更换方法: compile('org.springframework.boot:spring-boot-starter-web') { exclude module: "spring-boot-starter-tomcat" } compile('org.springframework.boot:spring-boot-starter-undertow') 注:其它jar包也有可能隐式依赖了tomcat,保险起见最好加一个全局的排除处理 configurations { all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" } [27612-20171130234208570-1150757547.png]: /images/20210726/6d3cfe2439be43d889f8b13186019f24.png [27612-20171130234927742-1500855275.png]: /images/20210726/c1c7fb8d27214ae2beb3c5b923d69f16.png
还没有评论,来说两句吧...