-1

我们正在运行一个带有一些 Java 应用程序的 k8s 集群。作为容器运行时,我们使用 cr-io,作为 jvm 采用 openjdk-16 openj9(应该有良好的容器支持)。

最近我们的集群上的工作负载增加了,我们注意到容器不会释放未使用的堆内存。

我尝试了一些 gc 选项来实现这一点,但没有成功:

-Xtune:virtualized

-XX:+IdleTuningGcOnIdle -XX:IdleTuningMinIdleWaitTime=30 

-Xgc:concurrentScavenge

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/repository

我错过了什么?

4

1 回答 1

0

查看OpenJ9 用户文档 > 内存管理 > 堆大小 > 扩展和收缩

这解释了 OpenJ9 JVM 通过将分配的可用空间(在 GC 之后)的比率保持在由-xminf-xmaxf选项确定的范围内来调整堆大小。如果堆太小,JVM 会“急切地”扩展,但它“不愿意”收缩堆。

-xminf因此,考虑到and的默认设置,您观察到的行为(堆未缩小)可能只是正常行为-xmaxf。(您可以了解他们使用的-XX+PrintFlagsFinal选项。)

请注意,HotSpot JVM 具有大致相似的堆大小调整机制,尽管命令行选项不同。

于 2021-10-05T14:41:21.803 回答