【问题标题】:Kubernetes Pod memory usage does not fall when jvm runs garbage collectionjvm 运行垃圾回收时 Kubernetes Pod 内存使用量不下降
【发布时间】:2019-01-20 17:30:50
【问题描述】:

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

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

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

Pod 内存: 总 JVM 内存 JVM 的详细分解(抱歉所有颜色看起来都一样……感谢 Kibana)

我正在努力解决的是为什么在 16:00 之前堆内存显着减少时,Pod 内存不会也下降?

【问题讨论】:

  • 一般情况下,JVM 不会将为 Java Heap 保留的内存返回给 OS。但是,它可以根据 GC 算法执行此操作。 G1 释放堆内存,但仅在 Full GC 之后。请参阅this post 了解更多信息。

标签: java kubernetes jvm


【解决方案1】:

您正在创建一个资源限制为 1GB 内存的 pod。 您正在设置 -XX:MaxRAMFraction=2,这意味着您正在为 JVM 分配 50% 的可用内存,这似乎与您所绘制的 Memory Limit 相匹配。

然后,JVM 会保留大约 80% 的内容,这就是您在 Memory Consumed 中绘制的内容。

当您查看Memory Consumed 时,您不会看到内部垃圾收集(如第二张图所示),因为该 GC 内存已释放回 JVM,但仍被它保留。

您的 Java 应用程序中是否可能存在内存泄漏?随着时间的推移,它可能会导致更多的内存被保留,直到达到 JVM 限制 (512MB) 并且您的 pod 被 OOM 杀死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2023-03-24
    • 2017-01-31
    • 2020-12-25
    相关资源
    最近更新 更多