增加 ECS 容器的最大堆大小

Posted

技术标签:

【中文标题】增加 ECS 容器的最大堆大小【英文标题】:Increase max heap size of ECS container 【发布时间】:2021-09-28 07:37:21 【问题描述】:

似乎无论我尝试什么,在我的容器上运行 java -XshowSettings:vm -version 都会产生相同的输出

VM settings:
    Max. Heap Size (Estimated): 494.94M
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment 18.9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.11+9, mixed mode, sharing)

我不知道如何从494.94M 增加最大堆大小。

这是我的 Dockerfile

FROM maven:3.6.3-openjdk-11-slim AS builder
WORKDIR /app
COPY pom.xml .
COPY src src
RUN mvn package
ARG JAR_FILE=target/*.jar
RUN java -Djarmode=layertools -jar $JAR_FILE extract

FROM openjdk:11-jre-slim
WORKDIR /app
EXPOSE 8081
COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./
ENV JAVA_OPTS="-XX:MinRAMPercentage=30 -XX:MaxRAMPercentage=90"
CMD java $JAVA_OPTS org.springframework.boot.loader.JarLauncher

我的 ECS 任务的内存设置为 2048,因此将最大堆设置为 90% 我希望看到更接近的值。

我也尝试过直接在 ECS 任务定义中覆盖 JAVA_OPTS。我不断收到 OutOfMemory 错误,真的需要一些帮助!

【问题讨论】:

【参考方案1】:

一种选择是直接配置-Xmx option。默认情况下,OpenJDK 通常会为堆分配 25% 的 RAM。由于您使用的是 Java 11,因此您应该启用 Docker 支持,并且它看起来可以正确识别 ECS 任务内存限制,因为 2 GB * 25% = 512 MB,与您看到的 494.94 MB 大致匹配。

第二条路线是配置-XX:+UseCGroupMemoryLimitForHeap选项,以实现与Docker的更无缝集成。你可以查看this article,它的解释是:

它允许将堆设置为 cgroup 内存限制。 JVM 从/sys/fs/cgroup/memory/memory.limit_in_bytes 读取并使用该值而不是-XX:MaxRAM

【讨论】:

以上是关于增加 ECS 容器的最大堆大小的主要内容,如果未能解决你的问题,请参考以下文章

关于android中最大堆大小和可用内存的两个问题

Docker 中的 Neo4j - 最大堆大小导致硬崩溃 137

Java 8 中默认的最大堆大小 (-Xmx) 是多少?

32 位和 64 位 Windows 服务器上 JVM 的最大堆大小

如何为 Java (xmx)、Linux (centos) 设置默认的最大堆大小

我得到执行异常和大堆错误