Docker k8s上停靠的Spring Boot应用程序几乎占用了所有可用内存
我有一个简单的Spring启动应用程序,部署在k8s(2个POD)上。 简要描述了此应用程序从生产者接收消息并将其处理到消费者。没什么复杂的 UPD:Docker k8s上停靠的Spring Boot应用程序几乎占用了所有可用内存,docker,spring-boot,memory-management,memory-leaks,kubernetes,Docker,Spring Boot,Memory Management,Memory Leaks,Kubernetes,我有一个简单的Spring启动应用程序,部署在k8s(2个POD)上。 简要描述了此应用程序从生产者接收消息并将其处理到消费者。没什么复杂的 UPD: java版本:1.8.172 javaMemoryOpts:-Xmx2048m-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap 这是两个吊舱之一的内存消耗 蓝线-k8s请求的内存 橙色线条-工作集 绿线-服务使用 黄线-k8s的内存限制 问题在于,尽管服务简
- java版本:1.8.172
- javaMemoryOpts:-Xmx2048m-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap
- 蓝线-k8s请求的内存
- 橙色线条-工作集
- 绿线-服务使用
- 黄线-k8s的内存限制
事实上,我不知道它出了什么问题。有人有想法或者知道如何减少应用程序的内存使用吗?一般来说,Kubernetes代表请求并限制机制以控制资源(CPU、内存)。请求任务旨在为集群吊舱内的容器提供足够的资源。限制保证容器永远不会达到特定资源的定义值。请浏览并访问以下文章:
然后,您可以使用这些查找为K8S清单中的资源限制和资源请求设置一些合理的值。您需要的堆大小远远超过EG32MB——正如该文档中所述,Spring启动应用程序更喜欢512Mb或1Gb的容器内存。您可能会获得256Mb,但这很紧。mk_sta的回答很有帮助,您需要的所有信息可能都在这些文档中,但我觉得值得在完整的回答中总结要点 您的-Xmx2048m(2Gb)选项正在设置最大堆大小,但应用程序将使用更多的内存—元空间、垃圾收集器和大量其他开销(这是“堆外”内存) 无论应用程序多么简单,Java都将使用可用的堆大小。一个输出随机字符串的3行应用程序,如果给定2Gb堆,最终将全部使用。因此,不管你的Spring Boot应用程序是否“简单”——堆会不断增长,直到达到最大值,然后你会看到垃圾收集——这些都是你绿线上的锯齿状牙齿 因此,这两件事加在一起可能解释了为什么内存使用率的上限约为3.8Gb 您正在绘制的图形可能显示了一个性能良好的应用程序,所以不要担心内存泄漏。从照片上我看不出这些是次要的还是主要的收藏品。也就是说,我无法从图片中推断出缩小Xmx的风险有多小 尽管你说你的Spring Boot应用程序“简单”,但如果不看看它的pom,就无法知道它到底有多复杂。但是从mk_ska这里链接的文件 …是一个非常有用的应用程序,因为它为“小型”Spring Boot应用程序显示了一些良好的默认值-例如,使用Freemarker生成非静态内容的应用程序可以