jvm分層編譯級別

編譯級別有:
0:解釋代碼
1:簡單C1編譯代碼
2:受限的C1編譯代碼
3:徹底C1編譯代碼
4:C2編譯代碼性能

典型的編譯日誌能夠顯示,多數方法第一次編譯的級別是3,即徹底C1編譯。(固然,全部方法都從級別0開始。)若是方法運行得足夠頻繁,它就會編譯成級別4(級別3的代碼就會被丟棄)。最多見的狀況是:client編譯器從獲取了代碼如何使用的信息進行優化時纔開始編譯。優化

若是server編譯器隊列滿了,就會從server隊列中取出方法,以級別2進行編譯,在這個級別上,C1編譯器使用方法調用計數器和回邊計數器(但不須要性能分析的反饋信息)。這使得方法編譯得更快,而方法也將在C1編譯器收集分析信息以後被編譯爲級別3,最終當server編譯器隊列不太忙的時候被編譯爲級別4。線程

另外一方面,若是client編譯器全忙,本來排程在級別3編譯的方法就既能夠等待級別3編譯,也適合進行級別4的編譯。在這種狀況下,方法編譯會很快轉到級別2,而後由級別2轉到級別4。
那些不過重要的方法能夠從級別2或級別3開始編譯,但隨後會由於它們的重要性沒那麼高而轉爲級別1。另外,若是server編譯器出於某些緣由沒法編譯代碼,也會轉爲級別1。日誌

固然,代碼在逆編譯時會轉爲級別0。
有些標誌能夠控制某些級別轉換行爲,但調優可以獲得很樂觀的結果。當方法定期望的順序,即級別0→級別3→級別4編譯時,性能能夠達到最優。若是方法常常被編譯爲級別2,而且還額外有可用的CPU週期,那就能夠考慮增長編譯器的線程數,從而減小server編譯器隊列的長度。若是沒有額外可用的CPU週期,那你惟一能作的就是盡力減少應用的大小。server

相關文章
相關標籤/搜索