Lambda 関数の Java ランタイムにて最大ヒープメモリのサイズを指定する方法を教えてください

Lambda 関数の Java ランタイムにて最大ヒープメモリのサイズを指定する方法を教えてください

現状 Lambda 関数にて最大ヒープメモリサイズの指定を行う方法はございません。
Clock Icon2024.07.04

困っていること

Lambda 関数の Java ランタイムにて JVM パラメータを利用して最大ヒープメモリサイズの指定を行いたいです。
どのように設定すれば可能でしょうか。

どう対応すればいいの?

現状 Lambda 関数にて最大ヒープメモリサイズの指定を行う方法はございません。

Lambda 関数では下記のドキュメントに記載の通り、環境変数に JAVA_TOOL_OPTIONS を設定することで Java 仮想マシン (JVM) の設定変更が可能です。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-customization.html

しかし、現状最大ヒープメモリサイズ変更には対応しておりません。

https://aws.amazon.com/jp/blogs/architecture/field-notes-monitoring-the-java-virtual-machine-garbage-collection-on-aws-lambda/

Remember that the ability to tweak JVM parameters might change with future service features. You won’t be able to override parameters set by AWS Lambda (for example -Xmx).

最大ヒープメモリサイズは Lambda 関数のメモリ設定に比例いたしますので、変更を行う際は Lambda 関数側のメモリ設定の変更をご検討ください。

やってみた

本当に -Xmx パラメータが未対応なのか実際に検証を行ってみます。
今回利用するソースコードは以下のものになります。

package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import java.util.Map;

import software.amazon.awssdk.services.lambda.LambdaClient;

// Handler value: example.Handler
public class Handler implements RequestHandler<Map<String,String>, String> {

    private static final LambdaClient lambdaClient = LambdaClient.builder().build();

    @Override
    public String handleRequest(Map<String,String> event, Context context) {

        LambdaLogger logger = context.getLogger();
        logger.log("Handler invoked");

        // ヒープメモリ容量を取得
        long maxMem = Runtime.getRuntime().maxMemory();

        logger.log("Runtime.getRuntime().maxMemory():"+maxMem);

        long maxMemM = maxMem/1024/1024;

        // 見やすく整形
        logger.log("Runtime.getRuntime().maxMemory():"+maxMemM+"M");

        return "end";
    }
}

上記コードの作成には以下の記事を参考にさせていただきました。

https://dev.classmethod.jp/articles/building-lambda-of-java-in-cloud9/

使用するランタイムは java21 です。
以下がそれぞれの条件で実行してみた結果になります。

JAVA_TOOL_OPTIONS 関数メモリ 実行結果
指定なし 512 MB Runtime.getRuntime().maxMemory():421 MB
-Xmx256m 512 MB Runtime.getRuntime().maxMemory():421 MB
-Xmx1024m 512 MB Runtime.getRuntime().maxMemory():421 MB
指定なし 1024 MB Runtime.getRuntime().maxMemory():842 MB
-Xmx256m 1024 MB Runtime.getRuntime().maxMemory():842 MB
-Xmx1024m 1024 MB Runtime.getRuntime().maxMemory():842 MB

上記の結果からも -Xmx パラメータは未対応であり、最大ヒープメモリサイズは Lambda 関数のメモリに比例して大きくなることが確認できました。

参考資料

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.