Java docker 容器中的内存设置
Java memory settings in a docker container
我有一个 Java 应用程序,基于 Java8 OpenJDK。它是 运行 在限制为 20GB 的 docker 容器中。
tomcat的-Xms和-Xmx设置如下:
-Xms = 容器内存的 60%(由 cgroup 指定)- 所以 12GB
-Xmx = 容器内存的 80%(由 cgroup 指定)- 所以 16GB
这会在容器上留下 4GB 的空闲空间,这通常很好,但有时在负载下我看到 docker 容器退出(并且 java 进程被杀死)由于容器内存而导致 OOM使用量已超过 20GB。
我知道 -Xmx 设置是针对堆的,而不是整个 Java 进程和 JVM,因此预计容器上的 4GB 'headroom' 就足够了,但它似乎没有。
我知道所有用例都大不相同,但我的问题是,一般而言,对于内存限制为 20GB 的容器,设置 -Xmx 设置是否过高。
我一直在考虑使用 MaxRAM 设置,同样,我知道它只决定堆内存,但我不确定这是否会产生任何积极影响?
通常情况下您使用 MaxRAM 或 -Xmx,还是同时设置两者有什么好处?
如果我使用 MaxRAM 而不是 -Xmx,java 将如何为堆分配内存?是否有一个简单的算法,例如,MaxRAM 设置的 50%?这样做会 java 更有效地管理内存吗?
whether, in general terms, setting the -Xmx setting is too high for a container whose memory limit is 20GB
视情况而定。应用程序可以使用比指定的 -Xmx
更少的 RAM,也可以比指定的 -Xmx
使用 2 倍或 3 倍的 RAM。这两种应用我都见过很多。
参见 。
与其尝试根据给定的容器限制(它们可能完全不相关)猜测合适的堆大小,不如将 -Xmx
设置为适合您的特定值的值应用?我的意思是,如果您的应用程序仅使用 8 GB 堆就可以正常工作,则无需提供更多,即使容器允许也是如此。
Is it generally the case that you use either MaxRAM or -Xmx, or is there any benefit to setting both?
两者都设置是没有意义的,因为 Xmx
会覆盖 MaxRAM
。
I were to use MaxRAM instead of -Xmx, how would java allocate memory to the heap? Is there a simple algorithm for this, for example, 50% of the MaxRAM setting?
见
Will java manage memory any more efficiently doing it that way?
没有。 MaxRAM
仅影响堆大小的计算和默认垃圾收集器(未明确指定时)。
我有一个 Java 应用程序,基于 Java8 OpenJDK。它是 运行 在限制为 20GB 的 docker 容器中。
tomcat的-Xms和-Xmx设置如下:
-Xms = 容器内存的 60%(由 cgroup 指定)- 所以 12GB -Xmx = 容器内存的 80%(由 cgroup 指定)- 所以 16GB
这会在容器上留下 4GB 的空闲空间,这通常很好,但有时在负载下我看到 docker 容器退出(并且 java 进程被杀死)由于容器内存而导致 OOM使用量已超过 20GB。
我知道 -Xmx 设置是针对堆的,而不是整个 Java 进程和 JVM,因此预计容器上的 4GB 'headroom' 就足够了,但它似乎没有。
我知道所有用例都大不相同,但我的问题是,一般而言,对于内存限制为 20GB 的容器,设置 -Xmx 设置是否过高。
我一直在考虑使用 MaxRAM 设置,同样,我知道它只决定堆内存,但我不确定这是否会产生任何积极影响?
通常情况下您使用 MaxRAM 或 -Xmx,还是同时设置两者有什么好处?
如果我使用 MaxRAM 而不是 -Xmx,java 将如何为堆分配内存?是否有一个简单的算法,例如,MaxRAM 设置的 50%?这样做会 java 更有效地管理内存吗?
whether, in general terms, setting the -Xmx setting is too high for a container whose memory limit is 20GB
视情况而定。应用程序可以使用比指定的 -Xmx
更少的 RAM,也可以比指定的 -Xmx
使用 2 倍或 3 倍的 RAM。这两种应用我都见过很多。
参见
与其尝试根据给定的容器限制(它们可能完全不相关)猜测合适的堆大小,不如将 -Xmx
设置为适合您的特定值的值应用?我的意思是,如果您的应用程序仅使用 8 GB 堆就可以正常工作,则无需提供更多,即使容器允许也是如此。
Is it generally the case that you use either MaxRAM or -Xmx, or is there any benefit to setting both?
两者都设置是没有意义的,因为 Xmx
会覆盖 MaxRAM
。
I were to use MaxRAM instead of -Xmx, how would java allocate memory to the heap? Is there a simple algorithm for this, for example, 50% of the MaxRAM setting?
见
Will java manage memory any more efficiently doing it that way?
没有。 MaxRAM
仅影响堆大小的计算和默认垃圾收集器(未明确指定时)。