首页 > 解决方案 > 如何在 AWS Lambda 中调整 Java 垃圾收集器

问题描述

在我当前的项目中,我有用 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,或者这是完全关闭的黑盒?

标签: javaamazon-web-servicesgarbage-collectionaws-lambda

解决方案


调整 GC 无助于改善 AWS Lambda 的冷启动时间。JVM 语言比某些替代语言具有更长的冷启动时间,因为将 VM 实际加载到内存中然后从 jar 文件中加载所有类需要时间。使用反射来确定要加载什么的框架会进一步减慢速度。

要改善冷启动,请避免使用 Spring Boot 之类的框架并最小化您的依赖关系。你也可以试试胖 JAR。


推荐阅读