当jvm运行垃圾收集时,Kubernetes Pod内存使用率没有下降

66bbxpm5  于 2022-11-07  发布在  Kubernetes
关注(0)|答案(1)|浏览(571)

我很难理解为什么我的Java应用程序会缓慢地消耗掉pod的所有可用内存,导致Kubernetes将pod标记为内存不足。JVM(OpenJDK 8)是使用以下参数启动的:

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2

我正在监视pod使用的内存和JVM内存,并希望看到一些相关性,例如,在主要垃圾收集后,pod使用的内存也会下降。但是,我没有看到这一点。我在下面附上了一些图表:
Pod内存:

JVM总内存

JVM的详细分类(很抱歉,所有的颜色看起来都一样...谢谢Kibana)

我所纠结的是,为什么当堆内存在16:00之前显著减少时,pod内存没有随之下降?

edqdpe6u

edqdpe6u1#

看起来您正在创建一个资源限制为1GB内存的pod。您正在设置-XX:MaxRAMFraction=2,这意味着您正在为JVM分配50%的可用内存,这似乎与您绘制的Memory Limit相符。
然后JVM保留大约80%的数据,这就是您在Memory Consumed中绘制的数据。
当您查看Memory Consumed时,您不会看到内部垃圾收集(如第二个图中所示),因为GC内存被释放回JVM,但仍由JVM保留。
Java应用程序中是否可能存在内存泄漏?这可能会导致随着时间的推移保留更多的内存,直到达到JVM限制(512MB),并且Pod被OOM终止。

相关问题