Java docker容器中的JDK12内存行为

Java docker容器中的JDK12内存行为,java,docker,openjdk-12,Java,Docker,Openjdk 12,据我了解,从JDK12开始,旧的实验标志-XX:+UseCGroupMemoryLimitForHeap被删除,但将成为基线,例如,所有JDK12应用程序都将读取cgroup内存,并在内部默认情况下将其设置为-Xms和-Xmx。然而,当我在没有指定-Xmx的情况下运行-XX:+PrintFlagsFinal时,它显示我在一个分配了2GB内存限制的容器中只有512MB的MaxHeap内存 我是否错过了什么,社区决定删除-XX:+UseCGroupMemoryLimitForHeap标志,而无意支持

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


我是否错过了什么,社区决定删除
-XX:+UseCGroupMemoryLimitForHeap
标志,而无意支持行为?

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


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

谢谢,最后一部分是我不理解的,将其设置为25%。我将把MaxRAMFraction添加到更合理的值中。同时检查。