JVM 堆大小大于容器的内存限制

问题描述 投票:0回答:1

我在 k8s 集群中运行 Java (21) 应用程序。 我将

-Xms
-Xmx
值定义为 780 mib。 如果我将较低的值设置为
-Xmx
,应用程序会因内存不足错误而崩溃。
我将容器的请求和限制设置为 600 mib。 我预计应用程序会因内存不足错误而终止,但容器正在运行。

此外,通过使用

kubectl top
,我看到容器正在使用 545 mib,事实上,当我设置下限时,应用程序会因 OOM 崩溃。

如何

-Xms
-Xmx
高于限制且容器正在运行? 我发现定义较低的
-Xmx
值会导致 OOM,因此我假设 JVM 实际上正在使用它,但是当我将限制设置为此值(低于
-Xmx
)时,容器会运行。怎么可能?

java kubernetes jvm containers out-of-memory
1个回答
0
投票

出现内存不足错误不一定是因为堆。这可能是因为元空间区域正在增长。 -Xms 和 -Xmx 是堆内存区域的最小和最大内存分配。

为了解决您的问题,您应该通过内存转储进行检查和调查,并查看为什么使用此标签堆内存区域填充得太快

-XX:+HeapDumpOnOutOfMemoryError

如果您在 Kubernetes 集群中,您可以尝试以下操作:

  • 使用不同的垃圾收集器来优化你的内存。

  • 为元空间区域分配更高的内存。

  • 考虑基于内存或 CPU 指标的自动缩放。

© www.soinside.com 2019 - 2024. All rights reserved.