我在 k8s 集群中运行 Java (21) 应用程序。 我将
-Xms
和 -Xmx
值定义为 780 mib。 如果我将较低的值设置为-Xmx
,应用程序会因内存不足错误而崩溃。
我将容器的请求和限制设置为 600 mib。
我预计应用程序会因内存不足错误而终止,但容器正在运行。
此外,通过使用
kubectl top
,我看到容器正在使用 545 mib,事实上,当我设置下限时,应用程序会因 OOM 崩溃。
如何
-Xms
和-Xmx
高于限制且容器正在运行?
我发现定义较低的 -Xmx
值会导致 OOM,因此我假设 JVM 实际上正在使用它,但是当我将限制设置为此值(低于 -Xmx
)时,容器会运行。怎么可能?
出现内存不足错误不一定是因为堆。这可能是因为元空间区域正在增长。 -Xms 和 -Xmx 是堆内存区域的最小和最大内存分配。
为了解决您的问题,您应该通过内存转储进行检查和调查,并查看为什么使用此标签堆内存区域填充得太快
-XX:+HeapDumpOnOutOfMemoryError
如果您在 Kubernetes 集群中,您可以尝试以下操作:
使用不同的垃圾收集器来优化你的内存。
为元空间区域分配更高的内存。
考虑基于内存或 CPU 指标的自动缩放。