jvm分層編譯級別

2021-09-16 21:44:51 字數 776 閱讀 7130

編譯級別有:

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週期,那你唯一能做的就是盡力減小應用的大小。

JVM編譯優化

參考文章 整體描述 標量替換 虛擬機會用即時編譯器把執行頻繁的熱點 變成機器碼,並做相應優化。1 直譯器和編譯器的優點 直譯器優點 程式啟動快,占用記憶體小,編譯失敗時還能逆優化恢復到解析狀態 編譯器優點 執行時可探測熱點 並把位元組碼編譯成本地機器碼,這樣程式執行效率更高 2 在什麼情況下才會被判...

JVM即時編譯(JIT)

1 動態編譯 dynamic compilation 指的是 在執行時進行編譯 與之相對的是事前編譯 ahead of time compilation,簡稱aot 也叫靜態編譯 static compilation 2 jit編譯 just in time compilation 狹義來說是當某段...

分層編譯和逃逸分析

分層編譯和逃逸分析在1.8中是預設是開啟的 即時編譯 just in time compilation,jit 是一種通過在執行時將位元組碼翻譯為機器碼,從而改善位元組碼編譯語言效能的技術。在hotspot實現中有多種選擇 c1 c2和c1 c2,分別對應client server和分層編譯。1 c...