【问题标题】:AWS Lambda and inaccurate memory allocationAWS Lambda 和不准确的内存分配
【发布时间】:2016-02-09 17:42:23
【问题描述】:

我意识到我需要分配比我的 AWS Lambda 函数更多的内存,否则我会得到:

{
"errorMessage": "Metaspace",
"errorType": "java.lang.OutOfMemoryError"
}

例如,我有一个分配了 128MB 的 Lambda 函数,它总是因该错误而崩溃,而在控制台中它显示“使用的最大内存为 56 MB”。
然后我分配了 256MB,它不再崩溃,但它总是给我一个介于 75 和 85MB 之间的“使用的最大内存”。

怎么会?谢谢。

【问题讨论】:

  • 投反对票的人或许可以解释原因。
  • 我刚刚遇到了同样的问题。有谁知道为什么会这样?
  • 我也有类似的问题
  • 真正的问题:可以更改这些设置吗?

标签: amazon-web-services aws-lambda


【解决方案1】:

分配给 java lambda 函数的内存量由堆、元和保留的代码内存共享。

容器为分配 256M 的函数执行的 java 命令类似于:

java -XX:MaxHeapSize=222823k -XX:MaxMetaspaceSize=26214k -XX:ReservedCodeCacheSize=13107k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation -jar /var/runtime/lib/LambdaJavaRTEntry-1.0.jar

222823k + 26214k + 13107k = 256M

容器为分配 384M 的函数执行的 java 命令类似于

java -XX:MaxHeapSize=334233k -XX:MaxMetaspaceSize=39322k -XX:ReservedCodeCacheSize=39322k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation -jar /var/runtime/lib/LambdaJavaRTEntry-1.0.jar

334233k + 39322k + 39322k = 384M

所以,公式似乎是

85% 堆 + 10% 元 + 5% 保留代码缓存 = 100% 已配置函数内存

老实说,我不知道 Cloudwatch 日志中报告的“使用的最大内存”值是如何计算的。它与我看到的任何东西都不一致。

【讨论】:

  • 您可以通过ManagementFactory.getRuntimeMXBean().getInputArguments()找到它。
【解决方案2】:

这里发生的事情可能是以下两种情况之一:

  1. 该函数未能保留额外的内存并失败,导致您看到错误,并保持内存较低,因为对更多的请求导致 JVM 崩溃。
  2. 您只用尽了元空间,@jstell 指出它只占总内存的 10%,而且您只使用了 56MB 的堆空间。

当您使用更大的内存占用时,它会增加您的元空间分配,从而使函数能够运行。

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 2017-01-08
    • 2021-04-21
    • 2010-09-27
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多