容器上的jvm调优(Java8)

bqucvtff  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(705)

我们最近将应用程序堆栈从ec2迁移到ecs-ec2,我们的计划是将ecs-ec2堆栈迁移到生产环境。我们在ecs容器上调试应用程序时一直面临问题。我们在javaweb应用程序中使用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放到容器上”的例子。因此,现在升级到tomcatimage8.5.40,它使用openjdk“1.8.0\u212”(向后支持容器)。但是在使用上述dockerfile之后,当我们运行命令 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal 在容器中,它没有显示与我们在dockerfile in javaopts变量中提供的相同的jvm调优值(maxheap、minheap、gc、parallelgcthreads等)。

我在docker容器中本地尝试了类似的事情,但是同样的问题也发生了。
如何在使用tomcat服务器(java8)的基于docker容器的应用程序上进行jvm调优?任何帮助都将不胜感激。
ps:tomcat在启动时打印java\u opts配置 catalina.logs 文件。

vvppvyoh

vvppvyoh1#

在docker中运行jvm时,必须使用以下参数指定虚拟机可以从总可用内存中占用多少内存:
-XX:+UseContainerSupport -XX:MaxRAMPercentage=70.0 (这个标志表示jvm最多可以从docker映像内存中获取70%。默认情况下,此值为25%)
关于gc,您必须查看在该映像上运行的jvm构建。也许这个构建不允许您指定g1gc(您可以在这里查看原因)https://bugs.openjdk.java.net/browse/jdk-8148175)

相关问题