spring boot 微服务在部署在 ecs aws 的容器中消耗大量内存

Posted

技术标签:

【中文标题】spring boot 微服务在部署在 ecs aws 的容器中消耗大量内存【英文标题】:spring boot microservice consumes a lot of memory in container deployed in ecs aws 【发布时间】:2021-06-17 18:45:23 【问题描述】:

我在 Spring Boot 中有一个微服务,它部署在 ECS 中带有 corretto 11 的容器中。

组件以 512MB 部署,其初始消耗接近 50%,随着流量增加,内存增加且从未释放,以至于 ECS 中的任务崩溃,必须启动新的任务。

下图显示了内存随时间的行为,随着流量的增加,ECS 中的任务启动的时间越来越少。

Memory Consumption in a Container on AWS ECS

Spring Boot 版本:2.4.3 JDK 图片:Corretto 11

更新:

我对堆转储进行了探查和分析,发现 Spring 库的消耗量很高。

Heapdump analysis with VisualVM

【问题讨论】:

我怀疑,作为资源处理的一部分发生了一些密集的 IO 操作,您必须检查是否可以从代码角度进行优化,或者如果这是业务案例,那么您必须设置规则要根据内存占用进行升级,也可以根据 RAM CPU 使用率选择突发实例 【参考方案1】:

根据截图,问题似乎出在 DefaultListableBeanFactory 对象中。

请检查您的代码并确保您不会为每个请求都实例化 spring bean。如果是这样,您只需要静态地自动连接它们一次。

例如,检查以下解决方案: Memory leak in jboss service due to DefaultListableBeanFactory objects

这里解释一下为什么在可序列化的bean工厂管理中会出现内存泄漏:

https://github.com/spring-projects/spring-framework/issues/12159?focusedCommentId=57240&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-57240

附:我不认为 Spring 框架本身存在错误,但如果有,请升级 Spring Boot 到最新版本。也许您的版本包含一些错误,导致内存泄漏。

查看此报告的问题的详细信息: https://github.com/spring-projects/spring-framework/issues/25619

【讨论】:

以上是关于spring boot 微服务在部署在 ecs aws 的容器中消耗大量内存的主要内容,如果未能解决你的问题,请参考以下文章

在 EC2 服务器上将 Java Spring Boot 服务部署到生产环境

Spring Boot 微服务与 aws lambda

Spring Boot Admin + Docker 部署服务

AWS Beanstalk 中的 Spring Boot 微服务

spring boot部署服务器端微服务,server.address配置0.0.0.0

spring boot部署服务器端微服务,server.address配置0.0.0.0