Azure Container Apps 内の Java アプリでメモリを効率的に使用する (プレビュー)
Java 仮想マシン (JVM) は、OS メモリを複数のアプリケーション間で共有する必要があると想定しているため、メモリを控えめに使用します。 ただし、コンテナー アプリはメモリ使用量を最適化して、可能な限り最大量のメモリをアプリケーションで使用可能にすることができます。 このメモリ最適化は、Java 自動メモリ調整と呼ばれます。 メモリ調整を有効にすると、コードを変更しなくても、Java アプリケーションのパフォーマンスは通常 10% から 20% 向上します。
Azure Container Apps は、次の状況下で自動メモリ調整を提供します。
- 単一の Java アプリケーションがコンテナー内で実行されている場合。
- アプリケーションがソース コードまたは JAR ファイルからデプロイされる場合。
自動メモリ調整は既定で有効になっていますが、手動で無効にすることもできます。
メモリ調整を無効にする
自動メモリ調整はほとんどのシナリオで役に立ちますが、すべての状況に最適であるとは限りません。 メモリ調整は、手動または自動で無効にすることができます。
手動無効化
コンテナー アプリの作成時にメモリ調整を無効にするには、環境変数 BP_JVM_FIT
を false
に設定します。
次の例は、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))