JVM支援五種編譯級別 -
如果要禁用所有JIT編譯器並僅使用直譯器,請使用-Xint
。
使用-client
和-server
啟用相應的模式。
用戶端編譯器(C1)比伺服器編譯器(C2)更早地開始編譯程式碼。因此,在C2開始編譯時,C1已經編譯了程式碼段。
但是當它等待時,C2會對程式碼進行分析,以便比C1更了解它。因此,如果優化的偏移可以用於生成更快的二進位制檔案,它等待的時間。從使用者的角度來看,權衡是在程式的啟動時間和程式執行所花費的時間之間。如果啟動時間需要更多,則應使用C1。如果應用程式預計會執行很長時間(典型的是部署在伺服器上的應用程式),最好使用C2,因為它會生成更快的程式碼,從而大大抵消任何額外的啟動時間。
對於IDE(NetBeans,Eclipse)和其他GUI程式等程式,啟動時間至關重要。NetBeans可能需要一分鐘或更長時間才能啟動。在啟動NetBeans等程式時會編譯幾百個類。在這種情況下,C1編譯器是最佳選擇。
請注意,C1有兩個版本 - 32b
和64b
。C2只有64b。
在Java的舊版本中,使用者可以選擇以下選項之一 -
它來自Java 7。它使用C1編譯器啟動,隨著程式碼變得更熱,切換到C2。可以使用以下JVM選項啟用它:-XX:+ TieredCompilation
。Java 7中的預設值設定為false
,Java 8中的預設值設定為true
。
在五層編譯中,分層編譯使用:1 -> 4 -> 5
。