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。请注意 .
据我了解,从 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。请注意