JIT 編譯器

Just-In-Time (JIT) 編譯器是執行時期環境的一個元件,可透過在執行時期將位元組碼編譯為原生機器碼來改善 Java™ 應用程式的效能。

Java 程式由類別組成,這些類別包含與平台無關的位元組碼, JVM 可以在許多不同的電腦架構上解譯。 在執行時期, JVM 會載入類別檔,決定每一個個別位元組碼的語意,並執行適當的計算。 解譯期間的額外處理器及記憶體用量表示 Java 應用程式的執行速度比原生應用程式慢。 JIT 編譯器在執行時期將位元組碼編譯成原生機器碼,以協助改善 Java 程式的效能。

依預設會啟用 JIT 編譯器。 當已編譯方法時, JVM 會直接呼叫該方法的已編譯程式碼,而不是解譯它。 理論上,如果編譯不需要處理器時間和記憶體用量,編譯每一種方法都可以讓 Java 程式的速度符合原生應用程式的速度。

JIT 編譯需要處理器時間和記憶體用量。 當 JVM 第一次啟動時,會呼叫數千個方法。 編譯所有這些方法可能會顯著影響啟動時間,即使程式最終達到非常好的尖峰效能。

實際上,第一次呼叫方法時,並不會編譯這些方法。 對於每一個方法, JVM 會維護一個呼叫計數,從預先定義的編譯臨界值開始,每次呼叫該方法時即會遞減。 當呼叫計數達到零時,會觸發方法的即時編譯。 因此,通常使用的方法會在 JVM 啟動之後立即編譯,而較少使用的方法則會在不久之後編譯,或根本不會編譯。 JIT 編譯臨界值可協助 JVM 快速啟動,並仍具有改良的效能。 已選取臨界值,以取得啟動時間與長期效能之間的最佳平衡。

JIT 編譯器可以在不同的最佳化層次編譯方法: coldwarmhotveryHotscorching (請參閱 -Xjit中的 optlevel )。 較高的最佳化等級預期會提供更好的效能,但在 CPU 及記憶體方面也會有較高的編譯成本。 方法的起始或預設最佳化等級為 warm,但有時 JIT 啟發會將最佳化等級降級為 cold ,以縮短啟動時間。

方法可以透過不同的機制重新編譯至更高的最佳化等級。 其中一個機制是取樣: JIT 編譯器會維護一個專用的取樣執行緒,它會定期起動,並決定哪些 Java 方法更常出現在堆疊頂端。 這類方法被視為對效能更重要的方法,它們是在 hotveryHotscorching的較高層次重新最佳化的候選項。

您可以停用 JIT 編譯器,在這種情況下,將會解譯整個 Java 程式。 除了診斷或暫行解決 JIT 編譯問題之外,不建議停用 JIT 編譯器。