增加 ECS 容器的最大堆大小

如何解决增加 ECS 容器的最大堆大小

似乎无论我尝试什么,在我的容器上运行 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 错误,真的需要一些帮助!

解决方法

一种选择是直接配置 -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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?