У меня есть функция AWS Lambda, сконфигурированная только с 128 МБ памяти, запускается 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 просто больше памяти?
Ниже показана трассировка стека:
Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Метапроцесс в com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder.build(BeanDeserializerBuilder.java:347) в com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:242) в com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143) в com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2 (DeserializerCache.java:409) в com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer (DeserializerCache.java:358) в com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2 (DeserializerCache.java:265) в com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer (DeserializerCache.java:245) в com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143) в com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:439) в com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer (ObjectReader.java:1588) в com.fasterxml.jackson.databind.ObjectReader. (ObjectReader.java:185) в com.fasterxml.jackson.databind.ObjectMapper._newReader (ObjectMapper.java:558) в com.fasterxml.jackson.databind.ObjectMapper.reader(ObjectMapper.java:3108)
Когда я пытаюсь предоставить InstanceProfileCredentialsProvider или EnvironmentVariableCredentialsProvider, я получаю следующую трассировку стека:
Исключение в потоке "main" java.lang.Error: java.lang.OutOfMemoryError: Metaspace at lambdainternal.AWSLambda. (AWSLambda.java:62) в java.lang.Class.forName0 (Нативный метод) в java.lang.Class.forName(Class.java:348) at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94) Причиняется: java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1 (собственный метод) при java.lang.ClassLoader.defineClass(ClassLoader.java:763) в java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) на java.net.URLClassLoader.defineClass(URLClassLoader.java:467) в java.net.URLClassLoader.access $100 (URLClassLoader.java:73) в java.net.URLClassLoader $1.run(URLClassLoader.java:368) в java.net.URLClassLoader $1.run(URLClassLoader.java:362) в java.security.AccessController.doPrivileged(собственный метод) в java.net.URLClassLoader.findClass(URLClassLoader.java:361) в java.lang.ClassLoader.loadClass(ClassLoader.java:424) в java.lang.ClassLoader.loadClass(ClassLoader.java:357) в lambdainternal.EventHandlerLoader $PojoMethodRequestHandler.makeRequestHandler(EventHandlerLoader.java:421) в lambdainternal.EventHandlerLoader.getTwoLengthHandler(EventHandlerLoader.java:777) в lambdainternal.EventHandlerLoader.getHandlerFromOverload(EventHandlerLoader.java:802) в lambdainternal.EventHandlerLoader.loadEventPojoHandler(EventHandlerLoader.java:888) в lambdainternal.EventHandlerLoader.loadEventHandler(EventHandlerLoader.java:740) в lambdainternal.AWSLambda.findUserMethodsImmediate(AWSLambda.java:126) в lambdainternal.AWSLambda.findUserMethods(AWSLambda.java:71) в lambdainternal.AWSLambda.startRuntime(AWSLambda.java:219) в lambdainternal.AWSLambda. (AWSLambda.java:60)... еще 3 START RequestId: 58837136-483e-11e6-9ed3-39246839616a Версия: $LATEST END RequestId: 58837136-483e-11e6-9ed3-39246839616a REPORT RequestId: 58837136-483e-11e6-9ed3-39246839616a Продолжительность: 15002,92 мс Продолжительность: 15000 мс. Размер памяти: 128 МБ. Используемая максимальная память: 50 МБ
2016-07-12T14: 40: 28.048Z 58837136-483e-11e6-9ed3-39246839616a Задача после 15,00 секунд
РЕДАКТИРОВАТЬ 1 Если я увеличиваю память, выделенную для функции до 192 МБ, она работает нормально, хотя это, как ни странно, сообщает только о 59 МБ памяти в журналах cloudwatch. Я просто теряю оставшуюся память?