我有一个仅配置为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/

10-10 13:02