我在docker中运行java进程。我设置了xms(388m)和xmx(388m)。在应用程序启动后的某个时间,容器的内存消耗超过并达到大多数〜主机内存大小,并且容器被杀死。
docker stats
显示的内容详细信息:
Cmd :
java -server -Djava.net.preferIPv4Stack =真 -Djavafx.monocle.headless =真 -Dglass.platform =单片眼镜 -Dmonocle.platform =无头 -Dprism.order = SW -Djsse.enableSNIExtension = FALSE -XX:+ ExitOnOutOfMemoryError -XX:+ HeapDumpOnOutOfMemoryError -Xms388m -Xmx388m -XX:MetaspaceSize = 32m -XX:MaxMetaspaceSize = 64m -jar myApp-1.0.jar
我也尝试过多个论坛后设置MALLOC_ARENAS_MAX = 4(也尝试过2和1)。
我还在运行docker容器时尝试设置--memory和--memory-reservation。在这种情况下,容器在达到内存限制时被终止。
观察:在整个jvm的生命周期中,它使用的不到Xmx(388m)。但是docker stats
继续增加并达到~1.2g(主机内存为2g),并且在某些时候会导致Java进程中出现OOM。所以我假设GC-freed-memory没有返回容器操作系统。
感谢任何帮助。
我错了。
答案 0 :(得分:0)
我建议将资源限制在docker-container本身。如果您使用docker-compose运行容器,则可以使用 - resources 标记轻松完成。这样,docker容器从系统中获取的资源量就会受到限制。