如何在AWS Lambda中调优Java垃圾收集器

如何在AWS Lambda中调优Java垃圾收集器,java,amazon-web-services,garbage-collection,aws-lambda,Java,Amazon Web Services,Garbage Collection,Aws Lambda,在我当前的项目中,我使用Java编写了AWS Lambda函数。我在寻找减少Lambda冷启动延迟的方法。不幸的是,现在我无法在其他语言(Python或Go)上重写该函数。除了优化函数代码的标准操作之外,我还研究了其他方法 根据经验,我发现RAM值的增加会导致性能的提高。我对在Lambda环境中使用哪种JVM配置感兴趣,但这不是很容易访问的信息。因此,我尝试使用下一个函数来迭代RuntimeMXBean中的输入参数(我在Internet上发现了类似的研究): Lambda参数提取 package

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

根据经验,我发现RAM值的增加会导致性能的提高。我对在Lambda环境中使用哪种JVM配置感兴趣,但这不是很容易访问的信息。因此,我尝试使用下一个函数来迭代RuntimeMXBean中的输入参数(我在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.";
  }
}

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

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

要改善冷启动,请避免使用Spring Boot之类的框架,并尽量减少依赖性。你也可以试试胖罐子

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