Java CoreOS如何将内存分配给Docker容器?

Java CoreOS如何将内存分配给Docker容器?,java,tomcat,memory,memory-management,coreos,Java,Tomcat,Memory,Memory Management,Coreos,我正在运行一个容器,其中包括AWS(t2介质)中CoreOS服务器实例上带有tomcat docker base映像的J2EE webapp。最近,我遇到了在Docker容器中使用Java inside超过内存限制会导致容器失败()的问题。在阅读了上述文章之后,我有点担心我在CoreOS实例上运行的任何容器将来是否会遇到这个问题 所以我想知道当Docker run命令没有指定内存限制时,Docker容器的默认内存限制是多少,这就是我运行Docker容器的方式。正如本文所讨论的,答案说明了它的无限

我正在运行一个容器,其中包括AWS(t2介质)中CoreOS服务器实例上带有tomcat docker base映像的J2EE webapp。最近,我遇到了在Docker容器中使用Java inside超过内存限制会导致容器失败()的问题。在阅读了上述文章之后,我有点担心我在CoreOS实例上运行的任何容器将来是否会遇到这个问题

所以我想知道当Docker run命令没有指定内存限制时,Docker容器的默认内存限制是多少,这就是我运行Docker容器的方式。正如本文所讨论的,答案说明了它的无限性和它基于操作系统给予它的任何东西

但是我想知道CoreOS是如何详细决定给定容器的内存限制的,我是否应该担心设置一个容器的内存限制和CPU利用率,该容器正在运行一个带有tomcat基本映像的webapp(CoreOS中是否存在内存过载问题导致容器退出的可能性?).

对于这个问题,我在互联网上看到的所有文档都没有提供与CoreOS或tomcat docker image相关的明确答案

注意-我正在通过systemd管理Docker容器。

默认情况下,在Docker中。如果未指定容器的内存限制。但是,内存可能受到
cgroup
配置的限制。此外,如果您正在使用Kubernetes或其他管理系统,则可以

Tomcat是在虚拟机上运行的Java应用程序服务器。JVM试图根据参数(如内存)保留一定数量的内存。在TOMCAT中,这些参数可以在
catalina.sh
启动脚本或
catalina\u OPTS
JAVA\u OPTS
环境变量中指定。如果未根据JVM版本和可用内存指定内存限制。关于这个问题有一个讨论。Java使用的内存不会超过指定的内存。如果从Tomcat调用其他非Java程序,则必须跟踪这些应用程序使用的内存

  • 没有为Java运行时定义内存限制。也没有定义限制
  • 如果使用该模板,Java(和Tomcat)将使用默认值。您可以使用以下方法检查系统中的值:

    java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
    
    在您提到的页面中,他们在dockerfile中使用CMD:

    CMD java -XX:+PrintFlagsFinal -XX:+PrintGCDetails $JAVA_OPTIONS -jar java-container.jar
    
  • 您提到的页面使用了,它使用计算容器限制并使用50%的可用内存作为上限

  • 确定应用程序所需的内存量是测试的一部分。您可能会发现许多人在讨论这个和另一个Tomcat参数,例如允许的连接数和连接器中使用的线程数等
  • 您可以使用
    -e
    开关来定义内存限制,以设置环境变量

    $ docker run -d --name mycontainer -p 8080:8080 -m 800M -e JAVA_OPTIONS='-Xmx300m' ...
    
  • 如果为容器定义内存限制,则它必须大于Java使用的内存限制。Github中存在一个关于添加多少内存的问题



注意,最近的Java版本考虑了可用的内存和CPU。Java系统(包括tomcat),如果您没有足够的内存或内存限制小于运行时要求的值。Linux和Java使用乐观的
malloc
,它们可能会在一段时间后失败。您必须这样做。

谢谢您的回答。这正是我想要的。也感谢所有的资源。