TLDR;
为什么要在kubernetes应用中设置-Xmx
和-Xms
?
我们继承了一个kubernetes应用程序,该应用程序存在内存不足错误。看起来,初始开发人员设置了kubernetes资源限制(.95 CPU内核和4Gb内存),如下所示。但是,他们也将JAVA_OPTS -Xmx
中的最大堆大小设置为800 mb。
x1c 0d1x的数据
我已经找到了很多关于-Xmx
(例如this one)的最佳设置的好材料,但无法找到以下问题的直接答案:我们真的需要在kubernetes容器中设置-Xmx
(不太重要的是,-Xms
)吗?我们已经在容器resources
上设置了硬限制,那么设置这些标志有什么意义呢?如果我们把它们全部删除,后果会是什么?应用程序会更频繁地进行GC吗?它会动态地扩展堆大小,还是将堆大小最大值固定在某个默认的最大值(如256 MB)?有没有什么经验法则可以将-Xmx
设置为与kubernets容器成比例?
2条答案
按热度按时间ryevplcw1#
如果你没有设置最大堆大小,那么行为取决于所使用的java版本。当前的JRE支持确定容器限制,并使用它来指导它们的内部启发式。
当以较旧的版本运行时,将基于对容器可见的物理存储器来确定要用于堆的存储器,这可能是过多的。
请注意,达到容器的内存限制将导致终止进程并重新启动容器。
我建议您为Xmx和Xms使用一个合理的值(根据操作测试确定),以获得稳定的内存使用。
0md85ypi2#
从Java 10和Java 8u191开始,应该有很好的支持Java确定容器中的实际可用内存。不再需要使用
-Xmx
。建议使用XX:MaxRAMPercentage
,其值范围在75.0到80.0之间(例如XX:MaxRAMPercentage=75.0
)来源:
https://www.atamanroman.dev/development/2019/09/11/usecontainersupport-to-the-rescue.htmlhttps://pretius.com/blog/jvm-kubernetes/