【发布时间】: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