【问题标题】:Java GC runs cause increase of mem usage on OSJava GC 运行导致操作系统上的内存使用量增加
【发布时间】:2018-08-02 10:47:08
【问题描述】:

最近几天我看到一些行为破坏了我的一些假设。也许有人可以给我以下解释

事实

  • 我们在 GCP 的 K8s 中的 Docker 容器中运行 Java 应用程序
  • 我们的基础镜像是openjdk:8u171-jre-slim-stretch
  • 我们使用了标志 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap => 所以资源限制应该从容器而不是从主机获得 => IMO 有效
  • 我们聘请了XX:MaxRAMFraction=2,因此我们获得了堆的容器内存限制的一半左右 => IMO 有效
  • JVM 没有没有 -Xmx 设置
  • 影响 JVM 内存的唯一方法是通过 Kubernetes 资源限制 => 这正是我们想要的

我没有得到的东西

当 GC 启动(Scavenge 或 G1)时,container memory usage 会增加,但jvm memory usage 不会增加。为什么 GC 会从容器中消耗内存?好的,它将诸如从old gen 复制到young gen 的东西,所以我知道在短时间内使用了更多的内存。但我预计这将来自 JVM 进程,而不是来自某些内核进程。

【问题讨论】:

    标签: java docker kubernetes garbage-collection


    【解决方案1】:

    在我们的一个运行 Java pod 的 K8s 集群中设置内存和 CPU 限制时,我们遇到了一些问题,即 Prometheus 中的 pod 内存使用率显示得更高(甚至一些 pod 因探测错误而崩溃)。

    在进一步分析时,我们发现 GC 正在努力释放内存,因为与对象创建相比,限制太小了;导致 CPU 周期花费在 GC 上;而不是在实际工作中。我们通过增加 pod 内存限制来避免这种情况。

    因此,也许您可​​以增加提供给 pod 的最大内存限制,看看这是否会消失。我不确定这是否会对你有所帮助,但我想分享一下以防万一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2019-11-02
      • 2015-08-08
      相关资源
      最近更新 更多