分層編譯這兩種編譯方式是怎么協(xié)作的呢?
HotSpot虛擬機(jī)包含多個(gè)即時(shí)編譯器C1、C2和Graal 。其中,Graal是一個(gè)實(shí)驗(yàn)性質(zhì)的即時(shí)編譯器,可以通過參數(shù) -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler啟用,并且替換C2 。
C1和C2各有優(yōu)劣,適用于不同的場(chǎng)景 。在Java 7以前,只能選擇一種編譯器 。C1編譯快,但生成的代碼執(zhí)行效率一般,常用于對(duì)于執(zhí)行時(shí)間較短的,或者對(duì)啟動(dòng)性能有要求的程序,常用于客戶端;C2編譯慢,但生成的代碼執(zhí)行效率快,適用于對(duì)于執(zhí)行時(shí)間較長的,或者對(duì)峰值性能有要求的程序,常用于服務(wù)端 。實(shí)際上,C1對(duì)應(yīng)的參數(shù)是client,C2對(duì)應(yīng)的參數(shù)是server,也跟它們的應(yīng)用場(chǎng)景比較匹配 。
Java7引入了分層編譯的概念,綜合了C1的啟動(dòng)性能優(yōu)勢(shì)和C2的峰值性能優(yōu)勢(shì) 。C1和C2編譯出的機(jī)器碼是不同的 。C2代碼的執(zhí)行效率要比C1代碼高出30%以上 。機(jī)器碼越快,需要的編譯時(shí)間就越長 。分層編譯是一種折衷的方式,既能夠滿足部分不那么熱的代碼能夠在短時(shí)間內(nèi)編譯完成,也能滿足很熱的代碼能夠擁有最好的優(yōu)化 。
熱點(diǎn)代碼那怎么判定熱點(diǎn)代碼呢?
JVM會(huì)收集方法的運(yùn)行時(shí)信息,主要包括調(diào)用次數(shù)和循環(huán)回邊的次數(shù) 。當(dāng)方法的調(diào)用次數(shù)和循環(huán)回邊的次數(shù)的和,超過指定閾值時(shí),便會(huì)觸發(fā)即時(shí)編譯 。
循環(huán)回邊次數(shù)可以簡單理解為方法內(nèi)部代碼的循環(huán)次數(shù),比如方法內(nèi)部有for循環(huán)或while循環(huán) 。
在分層編譯出現(xiàn)前,這個(gè)閾值是由參數(shù)-XX:CompileThreshold指定的,使用C1時(shí),該值為1500;使用C2時(shí),該值為10000 。
當(dāng)啟用分層編譯時(shí),JVM使用另一套閾值系統(tǒng) 。在這套系統(tǒng)中,閾值的大小是動(dòng)態(tài)調(diào)整的 。JVM將閾值與某個(gè)系數(shù) s 相乘 。該系數(shù)與當(dāng)前待編譯的方法數(shù)目成正相關(guān),與編譯線程的數(shù)目成負(fù)相關(guān) 。
編譯線程默認(rèn)情況下編譯線程的總數(shù)目是根據(jù)處理器數(shù)量來調(diào)整的 。Java 虛擬機(jī)會(huì)將這些編譯線程按照1:2的比例分配給 C1和C2(至少各為1個(gè)) 。舉個(gè)例子,對(duì)于一個(gè)四核機(jī)器來說,總的編譯線程數(shù)目為3,其中包含一個(gè)C1編譯線程和兩個(gè)C2編譯線程 。
機(jī)器資源太少的時(shí)候,也可能各1個(gè)線程 。
用arthas可以看到編譯線程:
可以看到,它們的ID是-1,優(yōu)先級(jí)也是-1 。我們自己創(chuàng)建的線程優(yōu)先級(jí)是0~10,所以編譯線程的優(yōu)先級(jí)會(huì)更高一些 。
總結(jié)一句話來總結(jié)Java程序是怎么在機(jī)器上運(yùn)行的呢?首先Java程序員編寫Java代碼,然后Java代碼會(huì)被編譯成class文件,多個(gè)class文件會(huì)被打包成jar包或者war包 。然后JVM加載class文件,然后先解釋執(zhí)行為字節(jié)碼 。程序運(yùn)行一段時(shí)間后,JVM會(huì)通過方法調(diào)用次數(shù)和循環(huán)持續(xù)判斷一個(gè)方法是否為熱點(diǎn)代碼,如果是,會(huì)使用分層編譯,通過編譯線程編譯成字節(jié)碼,在機(jī)器上運(yùn)行 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 2021Java學(xué)習(xí)路線 java開發(fā)學(xué)習(xí)路線
- javascript選擇器推薦 javascript選擇器有哪些
- iis運(yùn)行php慢解決方法 iis運(yùn)行php久了非常慢
- java開發(fā)常用的框架 java框架都有哪些
- java語法基礎(chǔ) java結(jié)束循環(huán)的語句
- java中數(shù)組的定義與使用 java數(shù)組聲明和使用
- java點(diǎn)餐系統(tǒng)源碼 微信積分系統(tǒng)源碼
- 經(jīng)濟(jì)運(yùn)行的基礎(chǔ)是什么 經(jīng)濟(jì)是如何運(yùn)行的
- 達(dá)利歐經(jīng)濟(jì)機(jī)器是如何運(yùn)行的 經(jīng)濟(jì)機(jī)器是如何運(yùn)行的
- windows下運(yùn)行jar程序 jar文件打不開怎么辦
