如何在AWS Lambda中调整Java Garbage收集器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在AWS Lambda中调整Java Garbage收集器相关的知识,希望对你有一定的参考价值。

在我当前的项目中,我使用Java编写了AWS Lambda函数。我想方设法减少Lambda冷启动的延迟。不幸的是,在这一刻我无法用其他语言(Python或Go)重写函数。除了优化功能代码的标准操作之外,我还研究了其他方法。

根据经验,我发现增加RAM值可以提高性能。我感兴趣的是在Lambda环境中使用了哪种JVM配置,但它不是非常容易访问的信息。所以我尝试使用迭代RuntimeMXBean中的InputArguments的下一个函数(我在Internet中发现了类似的调查):

Lambda参数提取

package com.amazonaws.lambda.demo;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.List;

public class LambdaFunctionHandler implements RequestHandler<Object, String> {

  @Override
  String handleRequest(Object input, Context context) {
    context.getLogger().log("Input: " + input);

    RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    List arguments = runtimeMxBean.getInputArguments();

    for (String arg : arguments) {
      context.getLogger().log(arg);
    }

    return "Call succeeded.";
  }
}

我得到了这个结果:

-XX:MaxHeapSize=445645k
-XX:MaxMetaspaceSize=52429k
-XX:ReservedCodeCacheSize=26214k
-XX:+UseSerialGC
-Xshare:on
-XX:-TieredCompilation

如您所见,它配置为使用串行GC并且不使用分层编译。我不确定为什么AWS工程师会选择这样的配置,但尝试使用其他一些JVM设置会很有趣。是否有能力在AWS Lambda的JVM中调整GC或完全关闭blackbox?

答案

调整GC不会有助于改善AWS Lambda的冷启动时间。由于将VM实际加载到内存中然后加载jar文件中的所有类所花费的时间,JVM语言的冷启动时间比一些替代方案要长。使用反射来确定要加载的内容的框架将进一步降低速度。

要改善冷启动,请避免使用Spring Boot等框架并最大限度地减少依赖关系。你也可以尝试一个胖JAR。

以上是关于如何在AWS Lambda中调整Java Garbage收集器的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 lambda@edge 调整图像大小时修复访问被拒绝错误

如何从 JAVA 调用 AWS lambda 函数?

如何使用 Java + ChromeDriver 在 AWS Lambda 中运行 Google Chrome 进行 Selenium 测试

如何在 Node.js 中使用带有 API 网关的 AWS Lambda 发送二进制响应? [复制]

鉴于所有调用都是异步的,您如何在 lambda 中构建顺序 AWS 服务调用?

如何通过忽略未使用的资源从 aws cli 创建 aws java lambda 函数?