關於 Azure Command Launcher for Java(公開預覽版)的常見問題

提供適用於 Java 的 Azure 命令啟動器常見問題的解答。

這個工具和 Java 指令有什麼不同?

除非使用者明確設定,否則 java 命令會以預設設定執行 HotSpot JVM (Java 虛擬機)。 jaz 是 Azure Command Launcher for Java 的一個元件,啟動 java 時採用經過實戰考驗、雲端優化的 JVM 預設值,旨在提升 Azure 虛擬機與容器的效能與成本效益。

主要優點:開發人員不需要手動調整 JVM。 jaz 為他們執行。

如果我已經在環境中設定了一些 JVM 選項,會發生什麼事?

如果你的工作負載包含 JVM 調校標誌,指令 jaz 不會套用自己的調校預設值。 jaz 會以您選擇的參數啟動java

我們建議移除工作負載的調校旗標,讓 Azure Command Launcher for Java 自行套用。

你也可以設定 jaz 忽略調校標誌,改用調校預設值。 考慮用這個配置來驗證 jaz ,對你的工作負載設定做最小的改動。 為此,請設定以下環境變數:

export JAZ_IGNORE_USER_TUNING=1

忽略使用者微調設定會套用至命令行自變數、由 java和 @-files 讀取的環境變數。

你也可以設定 jaz 以下環境變數,跳過所有調校預設:

export JAZ_BYPASS=1

使用「繞過選項」,你可以直接接入 Azure Command Launcher for Java,而不會影響目前的調校,即使你的工作負載使用的是該指令 java 的預設行為。 此行為有助於在清理 JVM 調校旗標前驗證工具行為。

在排除疑似與 JVM 調校相關的問題時,繞過調校也可能很有用。

哪些 JVM 選項被視為調音旗標?

指令 jaz 會將以 -X-XX 開頭的大多數旗標視為調整旗標,例如 -Xmx<size>。 一個以-X開頭但不是調音旗幟的著名例子是-Xlog:<opts>

更精確地說,每個 JVM 選項都是根據以下列表中的邏輯來評估。 此列表描述了最新版本 Azure Command Launcher for Java 的邏輯。

  1. 如果選項以除 -X之外的任何文字開頭,那就不是調音旗標。
  2. 如果選項符合上述任何一個正則表達式,那就不是調諧旗標:
    • ^-Xlog.+$
    • ^-XX:ErrorFile=.*$
    • ^-XX:[+-]?HeapDump.*$
    • ^-XX:[+-].*OnOutOfMemoryError$
  3. 否則,選項就是調音旗。

當尋找調諧標誌時 jaz ,會檢查傳遞給它的參數以及自動 java 讀取的環境變數。 環境變數如下:

  • Java 8: JAVA_TOOL_OPTIONS_JAVA_OPTIONS
  • Java 9 和更新版本:JAVA_TOOL_OPTIONS、、 JDK_JAVA_OPTIONS_JAVA_OPTIONS

jaz 也會處理 @-files,也稱為命令行自變數檔案。

使用這個工具時,我可以傳遞 Java 代理的旗標嗎?

Yes. 您仍然可以傳遞 -javaagent 和其他不是微調旗標的旗標,並且 jaz 會遵循它們。 您可以保留有用的診斷旗標,例如:

  • -Xlog 用於記錄
  • -javaagent 適用於 Application Insights 或其他應用程式效能監視 (APM) 檢測代理程式

這個工具是否相容於非 Azure 環境?

jaz 主要是針對 Azure 容器和虛擬機進行設計和測試,但可在技術上在其他地方執行。 不過,某些進階優化和未來的功能可能是 Azure 特定的。

這個工具有支援 Windows Server 嗎?

jaz 目前適用於 x64 和 arm64 環境的 Linux。 如果您急需Windows Server,請致電 openjdk-support@microsoft.com 與我們聯繫。

Java 版 Azure 指令啟動器僅在完整 JDK 安裝時進行測試與認證。 它可能無法與以下物件正常運作:

  • JRE(Java 執行環境)安裝
  • 自訂 jlink 運行時環境

完整的 JDK 安裝包含所有需要正常運作的工具與函式庫 jaz 。 JRE 和 jlink 的自訂執行時可能缺少這些元件,這會阻礙 jaz 正常運作。

為什麼我的 cgroup 掛載點這麼重要?

Java Azure 指令啟動器會從 /sys/fs/cgroup 讀取 cgroup v1 和 v2 資訊,以判斷可用資源,如記憶體限制與 CPU 限制,並相應調整 JVM。 如果 cgroup 檔案系統沒有掛載在標準 /sys/fs/cgroup 位置, jaz 可能無法正確偵測容器化限制。 這可能導致效能不佳,甚至記憶體不足錯誤,因為 jaz JVM 可能根據主機資源而非容器的實際限制調整。

我們尚未發現 cgroup 掛載點是 /sys/fs/cgroup 以外的真實情境。 不過,也可以在容器中模擬這種情況,方法是將 cgroup 檔案系統 /sys/fs/cgroup 從另一個位置卸載並掛載到另一個位置。 這樣就 jaz 無法讀取 cgroup 資訊,也無法套用容器感知的調校。

為了避免問題,請不要把 Cgroup 安裝點從標準 /sys/fs/cgroup 位置改掉。

雖然 cgroup 掛載點在容器化環境中最為重要,但在虛擬機及其他使用 cgroups 進行資源管理的 Linux 環境中也可能適用。

這個工具能支援巢狀 cgroup 配置嗎?

巢狀的 cgroup 設定會影響 Azure 指令啟動器 for Java 讀取資源限制的方式。 jaz 尚未用巢狀 cgroup 階層進行測試,因此可能無法正確偵測這些環境中的資源限制。

如果您正在使用巢狀 cgroups 並遇到不預期的行為,請聯絡我們。openjdk-support@microsoft.com