提供適用於 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 的邏輯。
- 如果選項以除
-X之外的任何文字開頭,那就不是調音旗標。 - 如果選項符合上述任何一個正則表達式,那就不是調諧旗標:
^-Xlog.+$^-XX:ErrorFile=.*$^-XX:[+-]?HeapDump.*$^-XX:[+-].*OnOutOfMemoryError$
- 否則,選項就是調音旗。
當尋找調諧標誌時 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 與我們聯繫。
為什麼它不能和 JRE 或 JLINK 執行時一起運作?
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