在本文中,我們全面探討了高階 JVM 選項,結合了全文討論中引用的見解和所提出的分析。
我們觀察了高階 JVM 引數以及它們如何增強垃圾收集、記憶體管理和執行時效能。雖然配置範圍可能讓人感到不知所措,但我們提到 JVM 人體工程學是一種有用的解決方案,可以簡化調優過程並最佳化應用程式效能。
Java 虛擬機器 (JVM) 是支援 Java 應用程式的強大引擎。它具有高度可定製性,透過標準選項提供基本配置,透過非標準選項提供常規效能調優,透過高階選項提供精確控制。
高階選項允許開發人員微調效能,診斷問題並試驗尖端功能。
在本教程中,我們將探索最著名的高階 JVM 選項及其使用方法,從而讓我們能夠更細粒度地控制 JVM 行為。
JVM選項的分類
JVM 引數主要可以分為三類:
- 標準選項(-version、-help)
- 非標準選項(-X:選項)
- 高階選項(-XX:選項)
瞭解高階 JVM 選項
高階選項超越了基本配置,可以設定 JVM 的低階屬性。這些選項允許我們調整效能關鍵引數,例如垃圾收集、記憶體管理和執行時診斷。
其中一些高階選項也是最常用的最重要的 JVM 引數之一。瞭解如何在 IntelliJ 中設定這些 JVM 選項對於調整 JVM 以進行開發和除錯大有裨益。
然而,由於它們針對特定應用場景提供了微調,我們必須謹慎使用它們。在沒有清楚瞭解應用程式行為的情況下進行過度定製可能會導致效能不佳、崩潰或意外行為。
此外,高階 JVM 選項不保證所有 JVM 實現都支援,並且可能會發生變化。因此,由於這些選項會隨著 JVM 更新而演變,因此某些選項可能會在較新版本中被棄用或表現不同。
例如,Java 併發標記和清除垃圾收集演算法就曾出現過這種情況,該演算法在 Java 9 中已棄用,並在 Java 14 中被刪除。透過監視文件,我們可以在任何更改發生之前隨時瞭解情況。
現在讓我們透過不同的類別探索各種高階 JVM 選項。
垃圾回收調優
垃圾收集對於記憶體管理至關重要,但可能會造成影響效能的暫停。高階選項可控制垃圾收集行為,確保應用程式執行更順暢。
自 Java 9 以來,預設設定是垃圾優先垃圾收集器(G1),旨在平衡吞吐量和延遲。
為了克服 G1 的延遲限制,JDK12 引入了Shenandoah GC,可以使用-XX:+UseShenandoahGC選項啟用。Shenandoah的可用性取決於 JDK 供應商和版本。
可以根據專門的工作負載使用其他實現。Epsilon垃圾收集器也非常適合效能調優,可以檢查垃圾收集是否影響我們程式的效能。
前面引用的主題探討了用於垃圾收集的各種有用的高階 JVM 選項。
記憶體管理
正如我們上面討論的,垃圾收集是記憶體管理的重要組成部分,但它只是 JVM 中更大的記憶體管理生態系統的一部分。
為了獲得最佳效能,配置記憶體分配、管理堆大小以及瞭解堆外記憶體的工作原理同樣重要,尤其是對於記憶體密集型應用程式或具有特定效能要求的系統。
現在,讓我們回顧一下與記憶體管理相關的一些高階 JVM 選項:
- -XX:InitialHeapSize和-XX:MaxHeapSize – 這些選項定義初始和最大堆大小(以位元組為單位)
- -XX:MetaspaceSize和-XX:MaxMetaspaceSize – 這些選項定義元空間區域的初始和最大大小
- -XX:InitialRAMPercentage和-XX:MaxRAMPercentage – 這些選項將初始和最大堆大小定義為系統可用記憶體的百分比。這些設定允許 JVM 動態擴充套件其記憶體使用量,從而提供更好的適應性
- -XX:MinHeapFreeRatio和-XX:MaxHeapFreeRatio – 這些選項定義 GC 週期後堆中維護的可用空間的最小和最大百分比
- -XX:+AlwaysPreTouch – 透過在 JVM 初始化期間預觸碰 Java 堆來減少延遲。因此,每個堆頁面都在 JVM 啟動時初始化,而不是在應用程式執行期間逐步初始化
- -XX:MaxDirectMemorySize – 定義可為直接位元組緩衝區保留的記憶體量
- -XX:CompressedClassSpaceSize – 定義使用壓縮類指標( -XX:-UseCompressedClassPointers)時在元空間中儲存類後設資料所分配的最大記憶體
即時編譯
即時 (JIT) 編譯是 JVM 的一個重要元件,可在執行時將位元組碼編譯為本機機器碼,從而提高 Java 應用程式的效能。JIT 編譯器預設啟用,除非為了調查 JIT 編譯問題,否則不建議停用它。
讓我們回顧一下用於配置和調整 JIT 編譯的高階 JVM 選項:
- -XX:CICompilerCount – 定義用於 JIT 編譯的編譯器執行緒數。預設值與可用 CPU 和記憶體的數量成正比
- -XX:ReservedCodeCacheSize – 定義用於儲存 JIT 編譯的本機程式碼的記憶體區域的最大大小
- -XX:CompileThreshold – 定義方法首次編譯之前的方法呼叫次數
- -XX:MaxInlineSize – 定義 JIT 編譯器可以內聯的方法的最大允許大小(以位元組為單位)
診斷和除錯
診斷和除錯對於識別和解決 Java 應用程式中的問題(例如效能瓶頸、記憶體洩漏和意外行為)至關重要。
讓我們回顧一下與診斷和除錯相關的高階 JVM 選項,這些選項可以幫助我們更深入地瞭解應用程式的行為和效能:
- -XX:+HeapDumpOnOutOfMemoryError –發生OutOfMemoryError時生成堆轉儲
- -XX:HeapDumpPath – 定義儲存堆轉儲的檔案路徑
- -XX:+PrintCompilation – 記錄 JIT 編譯
- -XX:+LogCompilation – 將詳細的 JIT 編譯日誌寫入檔案
- -XX:+UnlockDiagnosticVMOptions – 解鎖預設情況下不可用的診斷 JVM 選項
- -XX:+ExitOnOutOfMemoryError – 遇到OutOfMemoryError時強制 JVM 立即退出
- -XX:+CrashOnOutOfMemoryError – 強制 JVM 生成核心轉儲並在發生OutOfMemoryError時崩潰
- -XX:ErrorFile – 定義發生不可恢復的錯誤時儲存錯誤資料的檔案路徑
- -XX:NativeMemoryTracking – 定義跟蹤 JVM 本機記憶體使用情況的模式(關閉/摘要/詳細)
- -XX:+PrintNMTStatistics – 在 JVM 退出時啟用列印收集的本機記憶體跟蹤資料。僅當啟用本機記憶體跟蹤時才可使用 ( -XX:NativeMemoryTracking )
用於記錄 GC 資訊的高階 JVM 選項-XX:+PrintGC和-XX:+PrintGCDetails自 Java 9 以來已被棄用,應該用統一日誌記錄選項-Xlog替換。
人體工程學
我們探索了許多強大的高階 JVM 選項,這可能會讓我們覺得配置和調整 JVM 以滿足我們的特定要求是一件非常困難的事情。JVM透過人體工程學提供了一種解決方案,可以根據底層硬體和執行時條件自動調整其行為,從而提高應用程式的效能。
讓我們列出我們環境中的所有人體工程學預設值:
java -XX:+PrintFlagsFinal -version
然而,儘管人體工程學旨在設定合理的預設值,但它們可能並不總是符合我們的應用程式的需求。