Azure Container Apps で Java アプリのメモリを効率的に使用する

Java 仮想マシン (JVM) は、OS メモリを複数のアプリケーション間で共有する必要があると想定しているため、メモリを控えめに使用します。 ただし、コンテナー アプリはメモリ使用量を最適化して、可能な限り最大量のメモリをアプリケーションで使用可能にすることができます。 このメモリ最適化は、Java 自動メモリ調整と呼ばれます。 メモリ調整を有効にすると、コードを変更しなくても、Java アプリケーションのパフォーマンスは通常 10% から 20% 向上します。

Azure Container Apps は、次の状況下で自動メモリ調整を提供します。

  • 単一の Java アプリケーションがコンテナー内で実行されている場合。
  • アプリケーションがソース コードまたは JAR ファイルからデプロイされる場合。

自動メモリ調整は既定で有効になっていますが、手動で無効にすることもできます。

メモリ調整を無効にする

自動メモリ調整はほとんどのシナリオで役に立ちますが、すべての状況に最適であるとは限りません。 メモリ調整は、手動または自動で無効にすることができます。

手動無効化

コンテナー アプリの作成時にメモリ調整を無効にするには、環境変数 BP_JVM_FITfalse に設定します。

次の例は、create コマンド、up コマンド、update コマンドでメモリ調整を無効にする方法を示しています。

az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --image <CONTAINER_IMAGE_LOCATION> \
  --environment <ENVIRONMENT_NAME> \
  --env-vars BP_JVM_FIT="false" 

メモリ調整が無効になっていることを確認するには、ログで次のメッセージを確認します。

Disabling jvm memory fitting, reason: manually disabled

自動無効化

次のいずれかの条件が満たされると、メモリ調整は自動的に無効になります。

  • 制限されたコンテナー メモリ: コンテナー メモリが 1 GB 未満の場合。

  • 明示的に設定されたメモリ オプション: JAVA_TOOL_OPTIONS を介して環境変数で 1 つ以上のメモリ設定が指定されている場合。 メモリ設定オプションには次の値が含まれます。

    • -XX:MaxRAMPercentage
    • -XX:MinRAMPercentage
    • -XX:InitialRAMPercentage
    • -XX:MaxMetaspaceSize
    • -XX:MetaspaceSize
    • -XX:ReservedCodeCacheSize
    • -XX:MaxDirectMemorySize
    • -Xmx
    • -Xms
    • -Xss

    たとえば、次の例に示すように、環境変数で最大ヒープ サイズを指定すると、メモリ調整は自動的に無効になります。

    az containerapp update \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --image <CONTAINER_IMAGE_LOCATION>  \
      --set-env-vars JAVA_TOOL_OPTIONS="-Xmx512m" 
    

    メモリ調整が無効になっていると、次のメッセージがログに出力されます。

    Disabling jvm memory fitting, reason: use settings specified in JAVA_TOOL_OPTIONS=-Xmx512m instead Picked up JAVA_TOOL_OPTIONS: -Xmx512m

  • 非ヒープ メモリ サイズが小さい: 計算されたヒープ サイズまたは非ヒープ サイズが小さすぎる (200 MB 未満の) 稀なケース。

メモリ調整が有効になっていることを確認する

起動時にログ ストリームを調べて、計算された JVM メモリ構成を参照するメッセージがあるか確認します。

起動時に出力されるメッセージの例を次に示します。

Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 2G, Thread Count: 250, Loaded Class Count: 12924, Headroom: 0%)

Picked up JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

実行時の構成

環境変数を設定して、メモリ調整動作に影響を与えることができます。

変数 出荷単位 説明
BPL_JVM_HEAD_ROOM Percentage BPL_JVM_HEAD_ROOM=5 指定されたパーセンテージに基づいてシステムのメモリ領域を残します。
BPL_JVM_THREAD_COUNT 番号 BPL_JVM_THREAD_COUNT=200 スレッドの推定最大数。
BPL_JVM_CLASS_ADJUSTMENT 番号
Percentage
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
JVM クラス数を明示的な値またはパーセンテージで調整します。

Note

これらの変数を変更しても、自動メモリ調整は無効になりません。

メモリ不足の警告

メモリ設定を自分で構成する場合は、メモリ不足の警告が表示されるリスクがあります。

コンテナーがメモリ不足になる理由には、次のものがあります。

  • ヒープ メモリが使用可能なメモリの合計を超えている。

  • 非ヒープ メモリが使用可能なメモリの合計を超えている。

  • ヒープ メモリ + 非ヒープ メモリが使用可能なメモリの合計を超えている。

コンテナーのメモリが不足すると、次の警告が表示されます。

OOM Warning: heap memory 1200M is greater than 1G available for allocation (-Xmx1200M) (OOM 警告: ヒープ メモリ 1200M は、割り当て可能な 1G を超えています (-Xmx1200M))

次のステップ