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

mar*_*rea 5 java amazon-web-services aws-lambda

我们得到

java.lang.OutOfMemoryError: Metaspace
Run Code Online (Sandbox Code Playgroud)

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

java -XX:MaxMetaspaceSize=192mb (just example sizes)
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

Par*_*fal 5

你正在从错误的方向接近这个问题。根据Java8 文档

默认情况下,可用于类元数据的本机内存量是无限的。使用选项 MaxMetaspaceSize 设置用于类元数据的本机内存量的上限

因此,显式配置元空间大小的唯一作用就是限制元空间内存量;它不会增加它。如果您想为元空间提供更多内存,则需要减少堆其余部分的预定义大小。

然而,这样做是错误的。

真正的问题是,您正在执行的操作加载的类数量超出了可用元空间的容纳范围。最可能的原因是您刚刚选择的内存配置对于您的部署包来说太小。你没有说你的配置值是多少,但如果我不得不猜测它大约是 512 MB。尝试 1024 或 1536。

您或您使用的库之一也可能以不受约束的方式动态创建类。在这种情况下,无论您为 Lambda 提供多少内存,最终都会耗尽空间。

诊断此问题的方法是使用TraceClassLoadingTraceClassUnloading标志在 Lambda 外部运行代码。您正在寻找具有“生成”名称的类,通常是数字或字母的随机序列。