我们最近将应用程序堆栈从EC2移到ECS-EC2,我们的计划是将ECS-EC2堆栈移到生产中。在ECS上的应用程序中,我们一直面临着调整问题.我们在我们的java web应用程序中使用tomcat。Dockerfile配置-
FROM tomcat:8.5.40-jre8
COPY checkout.war /usr/local/tomcat/webapps/
COPY server.xml /usr/local/tomcat/conf
COPY context.xml /usr/local/tomcat/conf
COPY catalina.sh /usr/local/tomcat/bin
ENV spring.profiles.active beta
ENV JAVA_OPTS="-Dspring.profiles.active=beta"
RUN echo "export JAVA_OPTS=\"$JAVA_OPTS -Djava.awt.headless=true -server -Xms12G -Xmx12G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=60 -XX:+UseStringDeduplication\"" >> /usr/local/tomcat/bin/setenv.sh
CMD ["sh", "-c", "catalina.sh run"]我们的应用程序栈很少-我们使用的是r5.xlarge实例类型,它在ECS-EC2中运行了4个服务,并且没有为任务提供硬内存限制(我们只为每个任务提供了2GB的软内存)。
我们到现在为止所做的-
我在互联网上看到了很多关于“--没有人把java放在容器上”的文章,示例。因此,现在升级到tomcat映像8.5.40,它使用开放的jdk "1.8.0_212“(向后支持容器)。但是在使用上面的Dockerfile之后,当我们在容器中运行命令java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal时,它不会显示相同的值来进行JVM优化(MaxHeap、MinHeap、GC、ParallelGCThreads等)。正如我们在JAVA_OPTS变量中的Dockerfile中提供的那样。

我在本地也尝试过类似的方法,但同样的问题正在发生。
如何使用Tomcat服务器(Java8)对基于码头容器的应用程序进行JVM优化?如有任何帮助,我们将不胜感激。
PS : Tomcat在启动JAVA_OPTS文件时打印catalina.logs配置。
发布于 2020-11-23 15:38:37
在docker中运行JVM时,必须使用以下参数来指定虚拟机可以从可用内存总量中提取多少内存:
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70.0 (此标志表示JVM可以从坞映像内存中获取最大70% )。默认情况下,此值为25%)
关于GC,您必须查看在该映像上运行的JVM构建。也许这个构建不允许您指定G1 GC (您可以在这里查看一下为什么是https://bugs.openjdk.java.net/browse/JDK-8148175)
https://stackoverflow.com/questions/64970287
复制相似问题