128MBのメモリのみで構成されたAWS Lambda関数がSNS(それ自体がS3によってトリガーされる)によってトリガーされ、S3からファイルをダウンロードします。私の機能でLambdaのAmazonS3Clientを作成する際のOutOfMemoryError
、私は次のようしている:
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");
}
私はコメントアウトと私はAmazonS3Clientの創造に孤立しているのOutOfMemoryErrorを取得していますので、このポストからロジックのすべてを除外しましたオブジェクト。私がそのオブジェクトを取り出したとき、私はエラーを取得しません。上のコードとまったく同じ結果がOutOfMemoryErrorになります。
私は128MBのメモリを関数に割り当てましたが、実際には資格情報を取得してAmazonS3Clientオブジェクトをインスタンス化するだけでは十分ではありませんか?
私は同様の結果を得AmazonS3Clientコンストラクタに
new EnvironmentVariableCredentialsProvider()
など
new InstanceProfileCredentialsProvider()
を与えてみました。
AmazonS3Clientオブジェクトを作成すると、単にメモリが増えますか?以下は
スタックトレースです:
Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Metaspace at com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder.build(BeanDeserializerBuilder.java:347) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:242) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:409) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:358) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:265) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:245) at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143) at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:439) at com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer(ObjectReader.java:1588) at com.fasterxml.jackson.databind.ObjectReader.(ObjectReader.java:185) at com.fasterxml.jackson.databind.ObjectMapper._newReader(ObjectMapper.java:558) at com.fasterxml.jackson.databind.ObjectMapper.reader(ObjectMapper.java:3108)
私はInstanceProfileCredentialsProviderまたはEnvironmentVariableCredentialsProviderを提供しようとすると、私は次のスタックトレースを取得:
Exception in thread "main" java.lang.Error: java.lang.OutOfMemoryError: Metaspace at lambdainternal.AWSLambda.(AWSLambda.java:62) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94) Caused by: java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at lambdainternal.EventHandlerLoader$PojoMethodRequestHandler.makeRequestHandler(EventHandlerLoader.java:421) at lambdainternal.EventHandlerLoader.getTwoLengthHandler(EventHandlerLoader.java:777) at lambdainternal.EventHandlerLoader.getHandlerFromOverload(EventHandlerLoader.java:802) at lambdainternal.EventHandlerLoader.loadEventPojoHandler(EventHandlerLoader.java:888) at lambdainternal.EventHandlerLoader.loadEventHandler(EventHandlerLoader.java:740) at lambdainternal.AWSLambda.findUserMethodsImmediate(AWSLambda.java:126) at lambdainternal.AWSLambda.findUserMethods(AWSLambda.java:71) at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:219) at lambdainternal.AWSLambda.(AWSLambda.java:60) ... 3 more START RequestId: 58837136-483e-11e6-9ed3-39246839616a Version: $LATEST END RequestId: 58837136-483e-11e6-9ed3-39246839616a REPORT RequestId: 58837136-483e-11e6-9ed3-39246839616a Duration: 15002.92 ms Billed Duration: 15000 ms Memory Size: 128 MB Max Memory Used: 50 MB
2016-07-12T14:40:28.048Z 58837136-483e-11e6-9ed3-39246839616a Task timed out after 15.00 seconds
EDIT 1私が割り当てられたメモリを増やした場合機能は192MBにもなりますが、奇妙なことですが、クラウドウォッチログで59MBのメモリしか使用しないという報告はありますが、うまく動作します。私は単に残りの記憶を失っていますか?
に128からラムダに割り当てられたメモリを増やしてみ? 私は、ジャックソンの原因であるクラスの読み込みのために、メタメモリの部分がオーバーロードされていると思います。メタ空間は全メモリの割合です。したがって、全体のjvmメモリを増やすと、メタスペースはOutOfMemoryErrorをスローする前に、より多くのメモリを使用して動作します。 メモリのメタスペース部分を増やすことができればいいでしょう。 (-XX:MaxMetaspaceSize = 512m)可能であれば、jacksonを調整する別の解決策がありますか? メタスペースの説明:https:// plumbr。eu/outofmemoryerror/metaspace –
私が気付いている解決策はありません... – Brooks