繁体   English   中英

可以在 AWS Lambda 上设置 JVM 内存设置吗?

[英]Can JVM memory settings be set on an AWS Lambda?

我们得到

java.lang.OutOfMemoryError: Metaspace

由于我们没有使用完整的内存空间,我们认为它是元空间大小。 我看过一些帖子说我们可以设置“一些”jvm设置,但我想设置其中的一些:

java -XX:MaxMetaspaceSize=192mb (just example sizes)
  1. 可以设置这些设置吗?
  2. 我可以在 yml 中的哪个位置执行此操作?

更新

以下是 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 提供多少内存,最终都会耗尽空间。

诊断此问题的方法是使用TraceClassLoadingTraceClassUnloading标志在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM