Java CoreOS如何将内存分配给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中。如果未指定容器的内存限制。但是,内存可能受到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容器的方式。正如本文所讨论的,答案说明了它的无限
cgroup
配置的限制。此外,如果您正在使用Kubernetes或其他管理系统,则可以
Tomcat是在虚拟机上运行的Java应用程序服务器。JVM试图根据参数(如内存)保留一定数量的内存。在TOMCAT中,这些参数可以在catalina.sh
启动脚本或catalina\u OPTS
和JAVA\u OPTS
环境变量中指定。如果未根据JVM版本和可用内存指定内存限制。关于这个问题有一个讨论。Java使用的内存不会超过指定的内存。如果从Tomcat调用其他非Java程序,则必须跟踪这些应用程序使用的内存
- 没有为Java运行时定义内存限制。也没有定义限制李>
- 如果使用该模板,Java(和Tomcat)将使用默认值。您可以使用以下方法检查系统中的值:
在您提到的页面中,他们在dockerfile中使用CMD:java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
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
,它们可能会在一段时间后失败。您必须这样做。谢谢您的回答。这正是我想要的。也感谢所有的资源。