Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker容器中的Java内存设置_Java_Docker_Memory_Jvm - Fatal编程技术网

docker容器中的Java内存设置

docker容器中的Java内存设置,java,docker,memory,jvm,Java,Docker,Memory,Jvm,我有一个基于Java8OpenJDK的Java应用程序。它在docker容器中运行,该容器的限制为20GB tomcat的-Xms和-Xmx设置如下所示: -Xms=由cgroup指定的容器内存的60%—so 12GB -Xmx=由cgroup指定的容器内存的80%-因此为16GB 这使得容器上有4GB的空闲空间,这通常是正常的,但有时在负载下,我会看到docker容器退出,java进程被OOM终止,因为容器内存使用量超过了20GB 我知道-Xmx设置是针对堆的,而不是针对整个Java进程和JV

我有一个基于Java8OpenJDK的Java应用程序。它在docker容器中运行,该容器的限制为20GB

tomcat的-Xms和-Xmx设置如下所示:

-Xms=由cgroup指定的容器内存的60%—so 12GB -Xmx=由cgroup指定的容器内存的80%-因此为16GB

这使得容器上有4GB的空闲空间,这通常是正常的,但有时在负载下,我会看到docker容器退出,java进程被OOM终止,因为容器内存使用量超过了20GB

我知道-Xmx设置是针对堆的,而不是针对整个Java进程和JVM的,因此我认为容器上的4GB“净空”已经足够了,但它似乎不够

我知道所有的用例都大不相同,但我的问题是,一般来说,对于内存限制为20GB的容器来说,-Xmx设置是否过高

我曾想过使用MaxRAM设置,我知道它只决定堆内存,但我不确定这是否会产生积极的影响

通常情况下是使用MaxRAM还是-Xmx,或者两者都设置有什么好处

如果我使用MaxRAM而不是-Xmx,java将如何为堆分配内存?是否有一个简单的算法,例如,50%的MaxRAM设置?java用这种方式管理内存会更有效吗

一般来说,对于内存限制为20GB的容器来说,-Xmx设置是否过高

视情况而定。应用程序可以使用比指定的-Xmx更少的RAM,也可以使用比指定的-Xmx多2倍或3倍的RAM。我见过很多这两种应用

与其尝试根据给定的容器限制来猜测适当的堆大小(这些限制可能完全不相关),不如将-Xmx设置为该值,这对于您的特定应用程序来说已经足够舒适了?我的意思是,如果您的应用程序只使用8GB堆就可以正常工作,那么即使容器允许,也不需要提供更多

通常情况下是使用MaxRAM还是-Xmx,或者两者都设置有什么好处

设置两者都是没有意义的,因为Xmx会覆盖MaxRAM

如果我使用MaxRAM而不是-Xmx,java将如何为堆分配内存?是否有一个简单的算法,例如,50%的MaxRAM设置

java用这种方式管理内存会更有效吗

否。MaxRAM仅在未明确指定时影响堆大小和默认垃圾收集器的计算

一般来说,对于内存限制为20GB的容器来说,-Xmx设置是否过高

视情况而定。应用程序可以使用比指定的-Xmx更少的RAM,也可以使用比指定的-Xmx多2倍或3倍的RAM。我见过很多这两种应用

与其尝试根据给定的容器限制来猜测适当的堆大小(这些限制可能完全不相关),不如将-Xmx设置为该值,这对于您的特定应用程序来说已经足够舒适了?我的意思是,如果您的应用程序只使用8GB堆就可以正常工作,那么即使容器允许,也不需要提供更多

通常情况下是使用MaxRAM还是-Xmx,或者两者都设置有什么好处

设置两者都是没有意义的,因为Xmx会覆盖MaxRAM

如果我使用MaxRAM而不是-Xmx,java将如何为堆分配内存?是否有一个简单的算法,例如,50%的MaxRAM设置

java用这种方式管理内存会更有效吗


否。MaxRAM仅在未明确指定时影响堆大小和默认垃圾收集器的计算。

MaxHeapSize计算为ContainerSize*MaxRAMPercentage。默认情况下,MaxRAMPercentage是最大容器大小的25%。我总是设置-XX:MaxRAMPercentage=70.0 75或80太多了,过了一段时间我得到了OOM,但从未设置-Xmx。有了这些设置,我就没有了OOM@OctavianR. 并非所有的JDK8版本都使用这种方法logic@OneCricketeer感谢您的更正,我没有检查所有JVM的发行版,我上面的评论适用于OpenJDK和其他可能的发行版。如果您想检查此计算是否适用于其他JVM,那么可以列出JVM的标志java-XX:+PrintFlagsFinalMolenpad@Octa百分比标志在8u192左右进行后端口。任何早期的JDK8版本都没有用于任何发行版,AFAIK@OneCricketeer我明白了,我想我还记得OpenJDK 1.8中的类似内容,那么在使用-XX:MaxRAMPercentage之前使用-XX:+PrintFlagsFinal应该可以解决这个问题。如果不存在,那么要么使用较新版本的JVM要么他应该设置-xmx MaxHeapSize被计算为ContainerSize*MaxRAMPercentage。默认情况下,M
axRAMPercentage是最大容器大小的25%。我总是设置-XX:MaxRAMPercentage=70.0 75或80太多了,过了一段时间我得到了OOM,但从未设置-Xmx。有了这些设置,我就没有了OOM@OctavianR. 并非所有的JDK8版本都使用这种方法logic@OneCricketeer感谢您的更正,我没有检查所有JVM的发行版,我上面的评论适用于OpenJDK和其他可能的发行版。如果您想检查此计算是否适用于其他JVM,那么可以列出JVM的标志java-XX:+PrintFlagsFinalMolenpad@Octa百分比标志在8u192左右进行后端口。任何早期的JDK8版本都没有用于任何发行版,AFAIK@OneCricketeer我明白了,我想我还记得OpenJDK 1.8中的类似内容,那么在使用-XX:MaxRAMPercentage之前使用-XX:+PrintFlagsFinal应该可以解决这个问题。如果没有,那么要么使用较新版本的JVM,要么设置-Xmx