Amazon web services AWS Lambda和不准确的内存分配

Amazon web services AWS Lambda和不准确的内存分配,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我意识到我需要分配比AWS Lambda函数所需的内存多得多的内存,否则我会得到: { "errorMessage": "Metaspace", "errorType": "java.lang.OutOfMemoryError" } 例如,我有一个分配了128MB的Lambda函数,它总是因为这个错误而崩溃,而在控制台中它说“使用了56MB的最大内存”。 然后我分配256MB,它不再崩溃,但它总是给我一个75到85MB之间的“使用的最大内存” 为什么?谢谢。分配给java lambda函数的内

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

{
"errorMessage": "Metaspace",
"errorType": "java.lang.OutOfMemoryError"
}
例如,我有一个分配了128MB的Lambda函数,它总是因为这个错误而崩溃,而在控制台中它说“使用了56MB的最大内存”。
然后我分配256MB,它不再崩溃,但它总是给我一个75到85MB之间的“使用的最大内存”


为什么?谢谢。

分配给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日志中报告的“使用的最大内存”值是如何计算的。它与我看到的任何东西都不一致。

这里发生的事情可能是两件事之一:

  • 函数无法保留额外的内存,并且失败,导致您看到的错误,并保持内存较低,因为请求更多内存导致JVM崩溃
  • 您只耗尽了元空间,@jstell指出,元空间只占总内存的10%,并且只使用了56MB的堆空间
    当您使用更大的内存占用时,它会增加元空间分配,从而使函数能够运行。

    否决的人可能会解释原因。我也遇到了同样的问题。有人知道为什么会发生这种情况吗?我有类似的问题。真正的问题是:这些设置可以更改吗?谢谢您的输入。您可以通过
    ManagementFactory.getRuntimeMXBean().getInputArguments()
    找到答案。