AWS Lambda和不准确的内存分配

Max*_*val 13 amazon-web-services aws-lambda

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

{
"errorMessage": "Metaspace",
"errorType": "java.lang.OutOfMemoryError"
}
Run Code Online (Sandbox Code Playgroud)

例如,我有一个分配了128MB的Lambda函数,它会随着该错误一直崩溃,而在控制台中它会显示"最大内存使用56 MB".
然后我分配256MB,它不再崩溃,但它总是给我一个75到85MB之间的"最大内存使用".

怎么会?谢谢.

jst*_*ell 11

分配给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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

334233k + 39322k + 39322k = 384M

所以,公式似乎是

85%堆+ 10%meta + 5%保留代码缓存= 100%配置的功能内存

老实说,我不知道如何计算Cloudwatch日志中报告的"Max Memory Used"值.它与我所看到的任何东西都不一致.