繁体   English   中英

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

[英]How to tune Java Garbage collector in AWS Lambda

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

调整GC不会帮助您缩短AWS Lambda的冷启动时间。 JVM语言的冷启动时间比某些替代方法更长,这是因为将虚拟机实际加载到内存,然后从jar文件加载所有类所花费的时间。 一个使用反射来确定加载内容的框架会进一步降低速度。

为了改善冷启动,请避免使用Spring Boot之类的框架,并尽量减少依赖。 您也可以尝试胖的JAR。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM