我很难理解为什么我的 Java 应用程序会慢慢消耗 Pod 可用的所有内存,导致 Kubernetes 将 Pod 标记为内存不足。 JVM (OpenJDK 8) 使用以下参数启动:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
我正在监视 Pod 使用的内存以及 JVM 内存,并希望看到一些相关性,例如在主要垃圾收集之后,使用的 Pod 内存也会下降。但是我没有看到这一点。我在下面附上了一些图表:
Pod 内存: JVM 总内存 JVM 的详分割解(抱歉所有颜色看起来都一样......感谢 Kibana)
我正在努力解决的是,为什么当 16:00 之前堆内存显着减少时,Pod 内存不会也下降?
最佳答案
看起来您正在创建一个资源限制为 1GB 内存的 Pod。
您正在设置-XX:MaxRAMFraction=2
这意味着您将 50% 的可用内存分配给 JVM,这似乎与您绘制的 Memory Limit
相匹配。 .
JVM 然后保留您在 Memory Consumed
中绘制的内容的大约 80% .
当您查看Memory Consumed
时您不会看到内部垃圾回收(如第二张图中所示),因为 GC 内存已释放回 JVM,但仍由 JVM 保留。
您的java应用程序是否可能存在内存泄漏?随着时间的推移,它可能会导致保留更多内存,直到达到 JVM 限制(512MB)并且您的 pod 被 OOM 杀死。
关于java - jvm运行垃圾收集时Kubernetes Pod内存使用率不下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279068/