概述

StackOverflow 文件

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 編譯器。