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有兩個版本 - 32b
和64b
。C2只有64b。
分層編譯
在Java的舊版本中,用戶可以選擇以下選項之一 -
- 編譯器(-Xint)
- C1(-client)
- C2(-server)
它來自Java 7。它使用C1編譯器啟動,隨著代碼變得更熱,切換到C2。可以使用以下JVM選項啟動它:-XX:+ TieredCompilation
。Java 7中的默認值設置為false
,Java 8中的默認值設置為true
。
在五層編譯中,分層編譯使用:1 -> 4 -> 5
。
上一篇:
Java虛擬機(JVM)JIT編譯器
下一篇:
Java虛擬機(JVM)32b與64b