Как настроить сборщик мусора Java в AWS Lambda

В моем текущем проекте у меня есть функция AWS Lambda, написанная на Java. Ищу способы уменьшить задержки холодного старта лямбды. К сожалению, на данный момент у меня нет возможности переписать функцию на другом языке (Python или Go). В дополнение к стандартным действиям для оптимизации кода функции я исследую другие способы.

Опытным путем я обнаружил, что увеличение объема ОЗУ приводит к повышению производительности. Меня интересовало, какая конфигурация JVM используется в среде Lambda, но это была не очень доступная информация. Поэтому я попытался использовать следующую функцию, которая выполняет итерацию через InputArguments в RuntimeMXBean (я нашел подобное исследование в Интернете):

Извлечение лямбда-параметра

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

Как видите, он настроен на использование Serial GC и не использует многоуровневую компиляцию. Я не уверен, почему инженеры AWS выбрали такую ​​конфигурацию, но было бы интересно попробовать использовать другие настройки JVM. Есть ли возможность настроить GC в JVM AWS Lambda или это полностью закрытый черный ящик?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 435
1

Ответы 1

Настройка GC не поможет сократить время холодного запуска AWS Lambda. Языки JVM имеют более длительное время холодного запуска, чем некоторые из альтернатив, из-за времени, необходимого для фактической загрузки виртуальной машины в память, а затем загрузки всех классов из файлов jar. Фреймворк, использующий отражение для определения того, что загружать, еще больше замедлит работу.

Чтобы улучшить холодный запуск, избегайте таких фреймворков, как Spring Boot, и минимизируйте свои зависимости. Вы также можете попробовать толстый JAR.

Другие вопросы по теме