AWS java lambda - "java.lang.OutOfMemoryError: Java heap space"

AWS java lambda - "java.lang.OutOfMemoryError: Java heap space"

有什么方法可以获取 java lambda 的 java 堆转储?我的 lambda 的第二个 运行 内存不足,但不幸的是我找不到任何类似于 jprofiler 的工具可以与 aws lambda 一起使用(我已经尝试过 codeGuru 和 x-ray 但它没有帮助很大)。

关于如何在 aws 上“调试”lambda 运行ning 的内存分配有什么建议吗?

** 编辑 - 我知道如何在本地 运行 并使用 JProfiler 和其他此类工具检查内存,但我需要一个很难在本地重现的特定场景,所以我想要 aws 的特定解决方案拉姆达环境。 **

设置 AWS CLI

aws iam list-mfa-devices --user-name <ur_user>

使用从 list-mfa-devices 到 get-session-token

的序列号
aws sts get-session-token --duration-seconds 3600 --serial-number
        <SerialNumber> --token-code <<Say from Google authenticator>>

AWS_ACCESS_KEY=AccessKeyId
AWS_SECRET_KEY=SecretAccessKey
AWS_SESSION_TOKEN=SessionToken

当您使用与 Parsifal 建议的内存设置相同的内存设置在本地启动您的处理程序方法时(从 Junit 说),将以上作为环境变量传递。与您的 Lambda 内存设置值相同 另外传递下面的 Vm 参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\ur_path
这将生成 HeapDump 文件,您可以使用 Eclipse MAT 来分析内存泄漏 这是我通常遵循的。这将适用于任何复杂的设置。 谢谢

Google 搜索“从 JVM 内部触发堆转储”将我带到了 this page by Baeldung,其中包含以下代码:

public static void dumpHeap(String filePath, boolean live) throws IOException {
    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(
      server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
    mxBean.dumpHeap(filePath, live);
}

我还没有尝试过,但已验证 HotSpotDiagnosticMXBean 存在于 Corretto 17 发行版中,因此它很可能可用于 Lambda。你当然应该写一个测试Lambda来验证。

我会在 Lambda 调用处理程序中首先执行此代码,仅查找活动对象,然后将文件上传到 S3。这将告诉您上次通话中您是否意外保留了任何内容。如果没有,您只需要更多内存即可。

您可能 运行 遇到的问题是 Lambda 仅提供 512 MB 的文件存储 space,并且堆转储很容易大于该值。如果您属于这种情况,那么您将需要使用 EFS 卷来保存文件(并且无需上传到 S3)。

我建议使用 Lambda 的请求 ID(可从上下文中获得)来唯一命名文件。这将使从执行日志中追溯变得容易。

最后,这仅用于开发。它会增加 Lambda 调用的大量时间。