我有一个仅配置为128MB内存的AWS Lambda函数,该函数由SNS触发(它本身由S3触发),并将从S3下载文件。
在我的职能中,我具有以下优势:
public class LambdaHandler {
private final AmazonS3Client s3Client = new AmazonS3Client();
public void gdeltHandler(SNSEvent event, Context context) {
System.out.println("Starting");
System.out.println("Found " + eventFiles.size() + " event files");
}
我已经注释掉了所有逻辑,并从这篇文章中排除了所有逻辑,因为我遇到了OutOfMemoryError,该错误与创建AmazonS3Client对象无关。当我取出那个物体时,我没有得到错误。上面的确切代码导致OutOfMemoryError。
我为该功能分配了128MB的内存,这真的不足以简单地获取凭据并实例化AmazonS3Client对象吗?
我尝试给AmazonS3Client构造函数
new EnvironmentVariableCredentialsProvider()
以及
new InstanceProfileCredentialsProvider()
结果相似。
创建AmazonS3Client对象是否仅需要更多内存?
下面是堆栈跟踪:
当我尝试提供InstanceProfileCredentialsProvider或EnvironmentVariableCredentialsProvider时,得到以下堆栈跟踪:
编辑1 如果将分配给该函数的内存增加到192MB,它的工作就很好了,尽管很奇怪,在cloudwatch日志中仅使用59MB的内存进行报告。我只是失去了其余的记忆吗?
最佳答案
在Lambda函数中使用AWS Java SDK时,我一直在观察这一点。
在创建任何一个AWS客户端(同步或异步)时,您似乎会离开Metaspace。
我认为这是由于Amazon Client在实例化时执行的事情所致,包括AmazonHttpClient创建以及动态加载请求处理程序链(AmazonEc2Client#init()
private方法的一部分)。
报告的内存使用情况可能是针对堆本身的,但可能不包括元空间。 AWS论坛上有几个主题,但是对此没有来自AWS的回复。
关于amazon-web-services - 在Lambda中创建AmazonS3Client时出现OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38342418/