docker 容器中的 JDK12 内存行为

JDK12 memory behavior in docker container

据我了解,从 JDK12 开始,旧的实验标志 -XX:+UseCGroupMemoryLimitForHeap 已被删除,但将成为基线,例如默认情况下,所有 JDK12 应用程序都会读取 cgroup 内存并将其设置为 -Xms-Xmx。但是,当我 运行 -XX:+PrintFlagsFinal 没有指定 -Xmx 时,它显示我在容器中只有 512MB 的内存用于 MaxHeap,分配的内存限制为 2GB。

我是不是漏掉了什么,社区决定删除 -XX:+UseCGroupMemoryLimitForHeap 旗帜而无意支持这种行为?

这是正确的。 Java 12 遵循 cgroup RAM 限制 (2GB) 并忽略主机上可用的总 RAM(大于 2GB)。由于未指定 -Xmx,默认的 JVM 行为是使用 25% 的可用 RAM,最终得到 512 MB 堆。实际上 -Xmx 是一个特定值,它覆盖 -XX:+UseCGroupMemoryLimitForHeap 和其他管理动态堆大小调整的标志。

假设您不想直接指定 -Xmx,您很可能想使用 -XX:MaxRAMFraction=1,这将使 JVM 使用 100% 的可用 RAM。请注意 .