docker内部的Java进程消耗的内存超过了指定的Xmx限制

docker内部的Java进程消耗的内存超过了指定的Xmx限制,java,ubuntu,memory,memory-management,docker,Java,Ubuntu,Memory,Memory Management,Docker,我在docker中运行java进程。我已经设置了xms(388m)和xmx(388m)。应用程序启动后,容器的内存消耗超过并达到most~主机内存大小,容器将被终止 当我使用jprofiler连接到java进程时,我看到堆小于Xmx 但是,容器中的top命令显示了docker stats显示的内容 当我在主机上运行相同的java进程时,它的内存使用量在Xmx边界内 详细信息: Docker版本1.12.1,内部版本23cf638 主机操作系统:Ubuntu 14.04 容器图片:Ubuntu

我在docker中运行java进程。我已经设置了xms(388m)和xmx(388m)。应用程序启动后,容器的内存消耗超过并达到most~主机内存大小,容器将被终止

  • 当我使用jprofiler连接到java进程时,我看到堆小于Xmx
  • 但是,容器中的top命令显示了
    docker stats
    显示的内容
  • 当我在主机上运行相同的java进程时,它的内存使用量在Xmx边界内
详细信息:

  • Docker版本1.12.1,内部版本23cf638
  • 主机操作系统:Ubuntu 14.04
  • 容器图片:Ubuntu14.04(也在Ubuntu16.04上试用过)
  • JRE:1.8.0_77(试过1.8.0_112,也试过1.8.0_121)(都是客户端JRE;我不能使用服务器JRE,因为这个应用程序需要JavaFX。我还使用monocle以无头模式运行应用程序)
  • Cmd

    java服务器 -Djava.net.preferIPv4Stack=true -Djavafx.单片眼镜.无头=真 -Dglass.platform=单片眼镜 -Dmonocle.平台=无头 -朝鲜秩序=西南 -djse.enableSNIExtension=false -XX:+ExitOnOutOfMemoryError -XX:+HEAPDUMPONAUTOFMEMORYERROR -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释放的内存不会返回容器OS

    感谢您的帮助

    编辑: 我错了

  • 即使在容器外部(当我在主机上运行时),jvm也在消耗相同数量的内存所以这不是docker的问题
  • 容器内外的Top命令结果相同。但是,探查器中显示的堆内存在限制范围内
  • 该应用程序使用JavaFXWebView,它创建了许多短期线程。我相信这会导致堆栈增长(不确定是否有任何方法可以测量)

  • 我建议将资源限制在docker容器本身。如果您使用docker compose来运行容器,那么可以通过使用-resources标记轻松完成。这样,docker容器从系统中获取的资源量就受到限制。

    我建议将资源限制在docker容器本身。如果您使用docker compose来运行容器,那么可以通过使用-resources标记轻松完成。这样,docker容器将从系统中获取的资源量是有限的。

    这可能与有关。这可能与有关。问题说明他们试图用docker限制它,但它只是终止了进程……问题说明他们试图用docker限制它,但它只是终止了进程。。。