Java Docker容器具有OutOfMemoryError

Java Docker容器具有OutOfMemoryError,java,docker,Java,Docker,我将Java Spring引导应用程序作为Docker容器部署到内存16 GB的服务器上 Docker服务器版本在Ubuntu 18.04.4 LTS上是19.03.12。我的Docker映像已安装了openjdk-11,作为Java运行时。入口点定义为: ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]

我将Java Spring引导应用程序作为Docker容器部署到内存16 GB的服务器上

Docker服务器版本在Ubuntu 18.04.4 LTS上是19.03.12。我的Docker映像已安装了openjdk-11,作为Java运行时。入口点定义为:

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
我启动容器时对CPU和内存没有任何限制,但当堆空间达到8GB时,应用程序总是会因OutOfMemoryError而死亡。还有一些其他容器正在运行,但系统仍有大约3-4 GB的可用内存


为什么容器中的JVM被限制为使用8GB内存,尽管“看到”了整个16GB内存?我必须做什么才能让JVM消耗系统提供的内存?

您可以使用命令行开关来调整JVM可用的堆大小。例如,要设置为操作系统和其他JVM函数留出4GB的最大12GB堆,请添加命令行参数
-Xmx 12G


没有办法告诉Java它可以使用它想要的内存,或者可以使用操作系统安装的内存-请参阅您假设JVM为您的应用程序提供了全部可用内存。事实并非如此。事实上,内存量是故意设置上限的——具体值取决于系统。您可以阅读更多有关确定应用程序实际可用内存量的信息


至于如何手动管理应用程序能够访问多少emory,请阅读本文。它对JVM参数有很好的解释。

尝试将-Xmx设置为8GB以上的值。只需将“-Xmx8G”添加到您的入口点。我想您的问题已经在这里得到了回答:不清楚您是否希望您的应用程序使用超过8G的堆。您可能还需要设置
-XX:+HeapDumpOnOutOfMemoryError
,并查看内存的去向。嘿,谢谢您的回答。我知道-Xms和-Xmx JVM选项。我希望有一些通用的方法来迫使系统或JVM达到系统的极限。因此,现在我必须解决这个问题,在部署时自动确定系统的可用内存,以便使用所需的堆选项启动容器,因为服务器可能不具有所有相同的资源。您不总是为容器提供相同数量的内存吗?您可以从
/sys/fs/cgroup/memory.max
读取容器的内存限制。如果用户未设置内存限制,请使用
awk'/^MemTotal/{print$2}'/proc/meminfo