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)
更新
以下是 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)
你正在从错误的方向接近这个问题。根据Java8 文档:
默认情况下,可用于类元数据的本机内存量是无限的。使用选项 MaxMetaspaceSize 设置用于类元数据的本机内存量的上限
因此,显式配置元空间大小的唯一作用就是限制元空间内存量;它不会增加它。如果您想为元空间提供更多内存,则需要减少堆其余部分的预定义大小。
然而,这样做是错误的。
真正的问题是,您正在执行的操作加载的类数量超出了可用元空间的容纳范围。最可能的原因是您刚刚选择的内存配置对于您的部署包来说太小。你没有说你的配置值是多少,但如果我不得不猜测它大约是 512 MB。尝试 1024 或 1536。
您或您使用的库之一也可能以不受约束的方式动态创建类。在这种情况下,无论您为 Lambda 提供多少内存,最终都会耗尽空间。
诊断此问题的方法是使用TraceClassLoading和TraceClassUnloading标志在 Lambda 外部运行代码。您正在寻找具有“生成”名称的类,通常是数字或字母的随机序列。
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |