分享方式:


在 Azure 容器應用程式中對 Java 應用程式有效使用記憶體 (預覽)

Java 虛擬機器 (JVM) 會保守地使用記憶體,因其假設 OS 記憶體必須在多個應用程式之間共用。 不過,容器應用程式可以最佳化記憶體使用量,並且盡可能為應用程式提供最多的可用記憶體。 此記憶體最佳化稱為 Java 自動記憶體調整。 記憶體調整啟用時,Java 應用程式效能通常可改善 10% 到 20%,無需任何程式碼變更。

在下列情況下,Azure 容器應用程式會提供自動記憶體調整:

  • 單一 Java 應用程式正在容器中執行。
  • 您的應用程式是從原始程式碼或 JAR 檔案部署的。

依預設會啟用自動記憶體調整,但可以手動停用。

停用記憶體調整

自動記憶體調整在多數情況下都有其效用,但不一定適用於所有情況。 記憶體調整可以手動或自動停用。

手動停用

若要在建立容器應用程式時停用記憶體調整,請將環境變數 BP_JVM_FIT 設定為 false

下列範例說明如何透過 createupupdate 命令停用記憶體調整。

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)

下一步