概述
Just-In-Time(JIT)
編譯器是 Java™執行時環境的一個元件,可在執行時提高 Java 應用程式的效能。
- Java 程式由類組成,這些類包含可由 JVM 在許多不同計算機體系結構上解釋的平臺中立位元組碼。
- 在執行時,JVM 載入類檔案,確定每個位元組碼的語義,並執行適當的計算。
解釋期間額外的處理器和記憶體使用意味著 Java 應用程式的執行速度比本機應用程式慢。
JIT 編譯器通過在執行時將位元組碼編譯為本機機器程式碼來幫助提高 Java 程式的效能。
預設情況下啟用 JIT 編譯器,並在呼叫 Java 方法時啟用。JIT 編譯器將該方法的位元組碼編譯為本機機器程式碼,並將其編譯為 just in time
以執行。
編譯方法時,JVM 直接呼叫該方法的編譯程式碼,而不是解釋它。從理論上講,如果編譯不需要處理器時間和記憶體使用,編譯每個方法可以使 Java 程式的速度接近本機應用程式的速度。
JIT 編譯確實需要處理器時間和記憶體使用。當 JVM 首次啟動時,會呼叫數千個方法。即使程式最終達到非常好的峰值效能,編譯所有這些方法也會顯著影響啟動時間。
- 實際上,方法在第一次呼叫時不會被編譯。對於每個方法,JVM 都維護一個
call count
,每次呼叫該方法時它都會遞增。 - JVM 解釋方法,直到其呼叫計數超過 JIT 編譯閾值。
- 因此,經常使用的方法是在 JVM 啟動後很快編譯的,而較少使用的方法會在很晚之後編譯,或者根本不編譯。
- JIT 編譯閾值有助於 JVM 快速啟動並且仍然具有改進的效能。
- 已仔細選擇閾值以在啟動時間和長期效能之間獲得最佳平衡。
- 編譯方法後,其呼叫計數將重置為零,並且對該方法的後續呼叫將繼續增加其計數。
- 當方法的呼叫計數達到 JIT 重新編譯閾值時,JIT 編譯器第二次編譯它,應用比先前編譯更多的優化選擇。
- 重複此過程,直到達到最大優化級別。
Java 程式中最繁忙的方法總是最積極地進行優化,從而最大限度地提高了使用 JIT 編譯器的效能優勢。
JIT 編譯器還可以測量 operational data at run time
,並使用該資料來提高進一步重新編譯的質量。
可以禁用 JIT 編譯器,在這種情況下將解釋整個 Java 程式。除了診斷或解決 JIT 編譯問題之外,不建議禁用 JIT 編譯器。