docker容器中的Java内存设置
我有一个基于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用这种方式管理内存会更有效吗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
否。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