[英]Can JVM memory settings be set on an AWS Lambda?
我们得到
java.lang.OutOfMemoryError: Metaspace
由于我们没有使用完整的内存空间,我们认为它是元空间大小。 我看过一些帖子说我们可以设置“一些”jvm设置,但我想设置其中的一些:
java -XX:MaxMetaspaceSize=192mb (just example sizes)
更新
以下是 lambda 的当前设置(通过:ManagementFactory.getRuntimeMXBean().getInputArguments())
-XX:MaxHeapSize=445645k, -XX:MaxMetaspaceSize=52429k, -XX:ReservedCodeCacheSize=26214k, -XX:+UseSerialGC, -Xshare:on, -XX:SharedArchiveFile=/var/lang/lib/server/runtime.jsa, -XX:-TieredCompilation, -Djava.net.preferIPv4Stack=true
你从错误的方向接近这个。 根据Java8 文档:
默认情况下,可用于类元数据的本机内存量是无限的。 使用 MaxMetaspaceSize 选项设置用于类元数据的本机内存量的上限
因此,显式配置元空间大小的唯一作用是限制元空间内存量; 它不会增加它。 如果要为元空间提供更多内存,则需要减小堆其余部分的预定义大小。
然而,这是错误的做法。
真正的问题是你正在做的事情加载了更多的类,而不是可用的元空间。 最可能的原因是您刚刚选择的内存配置对于您的部署包来说太小了。 你没有说你的配置值是多少,但如果我不得不猜测它大约是 512 MB。 尝试 1024 或 1536。
也有可能您——或您使用的库之一——正在以不受约束的方式动态创建类。 在这种情况下,无论您为 Lambda 提供多少内存,最终都会耗尽空间。
诊断此问题的方法是使用TraceClassLoading
和TraceClassUnloading
标志在 Lambda 之外运行您的代码。 您正在寻找具有“生成”名称的类,通常是数字或字母的随机序列。
有一种方法可以设置最大内存使用量。 注意:有限制,最小为 128,最大为 3008 MB。 在此处查看详细信息
使用 serverless.yml
provieder:aws
memorySize: 512 # Overwrite the default memory size. Default is 1024
使用 SAM 模板.yml
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
MemorySize: 512
如果您打算进行非常自定义的设置,则可以使用自定义运行时 - https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html您需要一个引导程序文件,它是入口点和可以定义应用程序的运行方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.