Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker k8s上停靠的Spring Boot应用程序几乎占用了所有可用内存_Docker_Spring Boot_Memory Management_Memory Leaks_Kubernetes - Fatal编程技术网

Docker k8s上停靠的Spring Boot应用程序几乎占用了所有可用内存

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的内存限制 问题在于,尽管服务简

我有一个简单的Spring启动应用程序,部署在k8s(2个POD)上。 简要描述了此应用程序从生产者接收消息并将其处理到消费者。没什么复杂的

UPD:

  • java版本:1.8.172
  • javaMemoryOpts:-Xmx2048m-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap
这是两个吊舱之一的内存消耗

  • 蓝线-k8s请求的内存
  • 橙色线条-工作集
  • 绿线-服务使用
  • 黄线-k8s的内存限制
问题在于,尽管服务简单,但内存使用率很高。 我已经分析了这个应用程序,但它似乎和服务没什么关系:大约60个线程,没有内存泄漏等等

使用的内存永远不会超过k8s限制,即使它非常接近它(无OOM)。 当然,我可以添加更多的豆荚,消费将变得更加平衡,但我认为这不是正确的方式

有一件事让我困惑,为什么即使在开始时,使用的内存总是高于要求


事实上,我不知道它出了什么问题。有人有想法或者知道如何减少应用程序的内存使用吗?

一般来说,Kubernetes代表请求并限制机制以控制资源(CPU、内存)。请求任务旨在为集群吊舱内的容器提供足够的资源。限制保证容器永远不会达到特定资源的定义值。请浏览并访问以下文章:

调整JVM是一个相当复杂的过程,以获得良好的结果和足够的计算系统利用率。我建议您查看有关此主题的下一个web链接:


通常,Kubernetes表示请求并限制机制,以控制资源(CPU、内存)。请求任务旨在为集群吊舱内的容器提供足够的资源。限制保证容器永远不会达到特定资源的定义值。请浏览并访问以下文章:

调整JVM是一个相当复杂的过程,以获得良好的结果和足够的计算系统利用率。我建议您查看有关此主题的下一个web链接:


mk_sta的回答很有帮助,您需要的所有信息可能都在这些文档中,但我觉得值得在完整的回答中总结要点

您的-Xmx2048m(2Gb)选项正在设置最大堆大小,但应用程序将使用更多的内存—元空间、垃圾收集器和大量其他开销(这是“堆外”内存)

无论应用程序多么简单,Java都将使用可用的堆大小。一个输出随机字符串的3行应用程序,如果给定2Gb堆,最终将全部使用。因此,不管你的Spring Boot应用程序是否“简单”——堆会不断增长,直到达到最大值,然后你会看到垃圾收集——这些都是你绿线上的锯齿状牙齿

因此,这两件事加在一起可能解释了为什么内存使用率的上限约为3.8Gb

您正在绘制的图形可能显示了一个性能良好的应用程序,所以不要担心内存泄漏。从照片上我看不出这些是次要的还是主要的收藏品。也就是说,我无法从图片中推断出缩小Xmx的风险有多小

尽管你说你的Spring Boot应用程序“简单”,但如果不看看它的pom,就无法知道它到底有多复杂。但是从mk_ska这里链接的文件

…是一个非常有用的应用程序,因为它为“小型”Spring Boot应用程序显示了一些良好的默认值-例如,使用Freemarker生成非静态内容的应用程序可以在32Mb堆中愉快地运行

因此,简单的答案是在看到垃圾收集的混乱之前,尝试将-Xmx缩小到尽可能小的大小。您也可以将其降至32Mb


然后,您可以使用这些查找为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生成非静态内容的应用程序可以