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 调用的大量时间。
有什么方法可以获取 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 调用的大量时间。