Java虛擬機器(JVM)編譯級別


JVM支援五種編譯級別 -

  • 編譯器;
  • C1完全優化(無分析);
  • 帶呼叫和後沿計數器的C1(輕型分析);
  • C1具有完整的分析;
  • C2(使用前面步驟中的分析資料);

如果要禁用所有JIT編譯器並僅使用直譯器,請使用-Xint

用戶端與伺服器JIT

使用-client-server啟用相應的模式。

用戶端編譯器(C1)比伺服器編譯器(C2)更早地開始編譯程式碼。因此,在C2開始編譯時,C1已經編譯了程式碼段。

但是當它等待時,C2會對程式碼進行分析,以便比C1更了解它。因此,如果優化的偏移可以用於生成更快的二進位制檔案,它等待的時間。從使用者的角度來看,權衡是在程式的啟動時間和程式執行所花費的時間之間。如果啟動時間需要更多,則應使用C1。如果應用程式預計會執行很長時間(典型的是部署在伺服器上的應用程式),最好使用C2,因為它會生成更快的程式碼,從而大大抵消任何額外的啟動時間。

對於IDE(NetBeans,Eclipse)和其他GUI程式等程式,啟動時間至關重要。NetBeans可能需要一分鐘或更長時間才能啟動。在啟動NetBeans等程式時會編譯幾百個類。在這種情況下,C1編譯器是最佳選擇。

請注意,C1有兩個版本 - 32b64b。C2只有64b。

分層編譯

在Java的舊版本中,使用者可以選擇以下選項之一 -

  • 編譯器(-Xint)
  • C1(-client)
  • C2(-server)

它來自Java 7。它使用C1編譯器啟動,隨著程式碼變得更熱,切換到C2。可以使用以下JVM選項啟用它:-XX:+ TieredCompilation。Java 7中的預設值設定為false,Java 8中的預設值設定為true

在五層編譯中,分層編譯使用:1 -> 4 -> 5