我们正在运行一个带有一些Java应用程序的k8s集群。作为容器运行时,我们使用cr-io,作为jvm,我们使用openj9(应该有很好的容器支持)。
最近我们的集群上的工作负载增加了,我们注意到容器不释放未使用的堆内存。
我已经尝试了一些gc选项来实现这一点,但没有成功:
-Xtune:virtualized
-XX:+IdleTuningGcOnIdle -XX:IdleTuningMinIdleWaitTime=30
-Xgc:concurrentScavenge
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/repository
我错过了什么?
查看OpenJ9用户文档>内存管理;堆大小>膨胀和收缩
这解释了OpenJ9 JVM通过在-xminf
和-xmaxf
选项确定的范围内保持已分配空间(在GC之后)的空闲空间比率来调整堆的大小。JVM将"急切地"扩展。如果堆得太小,但它是"勉强"的;关于压缩堆。
所以你观察到的行为(堆不收缩)可能只是-xminf
和-xmaxf
默认设置下的正常行为。(你可以通过-XX+PrintFlagsFinal
选项了解他们在做什么。)
注意HotSpot jvm有大致相似的机制来调整堆大小,尽管命令行选项不同。