在 Azure 容器應用程式中對 Java 應用程式有效使用記憶體 (預覽)
Java 虛擬機器 (JVM) 會保守地使用記憶體,因其假設 OS 記憶體必須在多個應用程式之間共用。 不過,容器應用程式可以最佳化記憶體使用量,並且盡可能為應用程式提供最多的可用記憶體。 此記憶體最佳化稱為 Java 自動記憶體調整。 記憶體調整啟用時,Java 應用程式效能通常可改善 10% 到 20%,無需任何程式碼變更。
在下列情況下,Azure 容器應用程式會提供自動記憶體調整:
- 單一 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"
若要確認記憶體調整已停用,請檢查記錄中是否有下列訊息:
停用 jvm 記憶體調整,原因:手動停用
自動停用
符合下列任一條件時,就會自動停用記憶體調整:
有限的容器記憶體:容器記憶體小於 1 GB。
明確設定記憶體選項:透過
JAVA_TOOL_OPTIONS
在環境變數中指定一或多個記憶體設定時。 記憶體設定選項包含下列值:-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"
記憶體調整停用時,您會在記錄中看到下列訊息輸出:
停用 jvm 記憶體調整,原因:使用 JAVA_TOOL_OPTIONS=-Xmx512m 中指定的設定,而非選取 JAVA_TOOL_OPTIONS: -Xmx512m
小型非堆積記憶體大小:在極少數的情況下,計算出的堆積大小或非堆積大小太小 (小於 200 MB)。
確認記憶體調整已啟用
在啟動期間檢查記錄資料流中是否有參考計算 JVM 記憶體設定的訊息。
以下是啟動期間的範例訊息輸出。
計算 JVM 記憶體設定:-XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (記憶體總計:2G,執行緒計數:250,已載入類別計數:12924,空餘空間:0%)
選取 JAVA_TOOL_OPTIONS:-XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M
執行階段設定
您可以設定環境變數以影響記憶體調整行為。
變數 | 單位 | 範例 | 描述 |
---|---|---|---|
BPL_JVM_HEAD_ROOM |
百分比 | BPL_JVM_HEAD_ROOM=5 |
根據指定的百分比為系統保留記憶體空間。 |
BPL_JVM_THREAD_COUNT |
數字 | BPL_JVM_THREAD_COUNT=200 |
估計的執行緒數目上限。 |
BPL_JVM_CLASS_ADJUSTMENT |
數字 百分比 |
BPL_JVM_CLASS_ADJUSTMENT=10000 BPL_JVM_CLASS_ADJUSTMENT="10%" |
依明確值或百分比調整 JVM 類別計數。 |
注意
變更這些變數並不會停用自動記憶體調整。
記憶體不足警告
如果您決定自行設定記憶體設定,就有可能會收到記憶體不足警告。
以下是容器記憶體不足的一些可能原因:
堆積記憶體大於可用記憶體總計。
非堆積記憶體大於可用記憶體總計。
堆積 + 非堆積記憶體大於可用記憶體總計。
如果您的容器記憶體不足,則會出現下列警告:
OOM 警告:堆積記憶體 1200M 大於可供配置的 1G (-Xmx1200M)