我意识到我需要为 AWS Lambda 函数分配比所需更多的内存,否则我会得到:
{
"errorMessage": "Metaspace",
"errorType": "java.lang.OutOfMemoryError"
}
例如,我有一个分配了 128MB 的 Lambda 函数,它一直因该错误而崩溃,而在控制台中它显示“最大内存使用了 56 MB”。
然后我分配了 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 日志中报告的“已使用的最大内存”值是如何计算的。它与我所看到的任何东西都不相符。
关于amazon-web-services - AWS Lambda 和不准确的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35298616/