Kubernetes Pod在jvm运行垃圾回收时内存使用量不会下降

3

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

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

我正在监控Pod使用的内存以及JVM内存,并期望看到一些关联性,例如在进行大量垃圾回收后,Pod使用的内存也会下降。然而我没有看到这个情况。下面是一些图表:
Pod内存: enter image description here 总JVM内存: enter image description here 详细的JVM分解(很抱歉所有颜色看起来都一样...感谢Kibana): enter image description here 我困惑的是,为什么在16:00之前堆内存有显著减少时,Pod的内存没有下降?

通常情况下,JVM不会将保留给Java Heap的内存返回给操作系统。但是,这取决于GC算法,它可以执行此操作。 G1会释放堆内存,但只有在Full GC之后才会这样做。有关更多信息,请参见此帖子 - apangin
1个回答

4
看起来您正在创建一个资源限制为1GB内存的pod。 您设置了-XX:MaxRAMFraction=2,这意味着将可用内存的50%分配给JVM,这似乎与您在内存限制图表中绘制的相匹配。
然后,JVM会保留约80%的内存,这是您在消耗内存图表中绘制的内容。
当您查看已消耗内存时,您将看不到内部垃圾收集(如第二个图表中),因为该GC内存被释放回JVM,但仍然被其保留。
您的java应用程序是否可能存在内存泄漏?这可能会导致随着时间的推移预留更多的内存,直到达到JVM限制(512MB),并导致pod遭受OOM杀死。

3
我意识到我从未回来过这里!你的直觉是正确的,根本原因是内存泄漏!非常感谢并接受答案! - Sutty1000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接