jvm的解釋執行與編譯執行
1、原理
字節碼無法直接交給硬件執行需要虛擬機翻譯成機器碼才能執行,“翻譯”的策略有兩種:解釋執行和編譯執行又稱即使編譯(JIT)。解釋執行是沒執行一句字節碼的時候把字節碼翻譯成機器碼並執行,優點是啟動效率快,缺點是整體的執行速度較慢。編譯執行預先把所有機器碼編譯成字節碼並一起執行,其特點與解釋執行相反,啟動較慢執行較快。
在jvm虛擬機中是兩者混合出現,既有解釋執行也有編譯執行。首先是解釋執行,一條條執行所有字節碼,如果JVM發現某個方法被頻繁的調用會把該方法用編譯執行的策略編譯好,下次執行的時候直接調用機器碼,這種方法被稱為熱點方法,由此可見編譯執行是以方法為單位。
從業務的角度而言服務端和用戶端對代碼的執行速度和啟動速度的要求是不一樣的。比如移動端的應用程序,用戶希望程序啟動速度較快,服務端的程序,可能對程序的執行速度有更高的要求,為此從java7開始HotSpot采用了分層編譯的方式,即引入了兩種即使編譯器:C1 C2。C1編譯器稱為client編譯器,面向對啟動性能有要求的用戶端,編譯時間段,優化策略簡單;C2稱為Serve駁岸一起面向對峰值性能有要求的服務器端,編譯時間長,優化策略復雜。具體的在編譯熱點方法的時候先采用C1編譯器,熱點方法中的熱點方法會被C2編譯器再次編譯。
2、JVM相關參數
-
-XX:CICompilerCount=n 指定JIT編譯器用來編譯方法的線程數量
-
-XX:CompileThreshold=n 指定一個方法的調用次數,以使HotSpot和JIT 編譯器能編譯它
-
-Xcomp 指定JVM在第一次使用時把所有的字節碼編譯成本地代碼. (即CompileThreshold=1)
-
-Xbatch 在前臺編譯方法,直到編譯完成方法才能執行
-
-Xint 僅僅使用解釋模式,不激活JIT編譯器 (即CompileThreshold=0)
jvm的解釋執行與編譯執行