如何在AWS ECS中增加Java堆大小?

5

我有一个使用Java SpringBoot开发的REST API。我将此API部署为AWS ECS中的Docker容器。我在AWS任务中分配了2048 MB的硬内存和1024 MB的软内存。当ECS启动Docker容器后,我访问Docker容器并执行以下命令

java -XX:+PrintFlagsFinal -version | grep HeapSize

我得到以下结果

 uintx ErgoHeapSizeLimit                         = 0                   {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
    uintx InitialHeapSize                          := 33554432                            {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    **uintx MaxHeapSize                              := 536870912**                           {product}

结果中显示的MaxHeapSize为536870912,大约为536 MB(软内存的一半)。

我想知道如何在AWS ECS环境中将此堆大小增加到至少800 MB。

我知道如何使用命令java -Xmx800m设置堆大小,但我不知道在AWS ECS环境中在哪里执行此命令。


1
如果您正在使用Java 11,则不应设置此设置。对于使用总内存的堆的容器,有新的设置可用。如果我没记错,默认值为80%。 - jordanm
https://www.eclipse.org/openj9/docs/xxinitialrampercentage/ - jordanm
3个回答

3

对我而言,通过在我的ECS任务定义中设置环境变量JAVA_TOOL_OPTIONS,它可以正常工作,具体如下:

环境变量 数值
JAVA_TOOL_OPTIONS -XX:InitialHeapSize=1g -XX:MaxHeapSize=2g

希望这能帮到您!

顺便说一句,我的容器正在运行Amazon Corretto JDK 8版本。


2

对于我来说,ECS好像没有忽略-Xmx参数。

我增加了任务的vCPU和内存参数,并希望增加堆大小。

我在容器命令的覆盖中使用了参数-XX:MaxRAMPercentage=80.0。最终成功了。


你是如何登录ECS查看选项是否被忽略的?@Erwan - Archmede
1
我记录了 Runtime.getRuntime().maxMemory(), Runtime.getRuntime().totalMemory()Runtime.getRuntime().freeMemory()。我认为我们无法登录到ECS实例,所以我让信息发送给我 :) 并与我配置的进行比较。 - Erwan

2
在您的Dockerfile中添加xmx属性。例如,cmd java -Xmx800m your_jar

我尝试了CMD ["java", "-Xmx3024m", "-Xms3024m", "-jar", "-Dconfpath=/conf", "-Dspring.profiles.active=aws", "/opt/lib/myjar.jar"],但是它报错“Error: Could not find or load main class java”。 所以我使用了命令 CMD ["-Xmx3024m", "-Xms3024m", "-jar", "-Dconfpath=/conf", "-Dspring.profiles.active=aws", "/opt/lib/myjar.jar"]。这个命令可以运行,但堆大小没有改变为3 GB。堆大小仍然显示为756 MB。有什么建议吗? - KurioZ7
1
尝试使用以下ENTRYPOINT ["sh","-c","java -Xmx3024m -Xms3024m -jar urjar"]和CMD [--spring.profiles.active=prod]进行编程。 - Saurabh Nigam
如果您能够在容器中进行SSH并处理命令,那么可以检查实际运行的命令是什么。检查分配给容器的内存。您还应该检查AWS ECS任务定义中指定的内存限制。 - Saurabh Nigam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接