3 回答

TA貢獻1982條經(jīng)驗 獲得超2個贊
HotSpot編譯策略相當復雜,尤其是對于分層編譯而言,它在Java 8中是默認啟用的。它既不是執(zhí)行次數(shù),也不是CompileThreshold參數(shù)。
最佳解釋(顯然是唯一合理的解釋)可以在HotSpot源代碼中找到,請參閱advancedThresholdPolicy.hpp。
我將總結此高級編譯策略的要點:
執(zhí)行從第0層(解釋器)開始。
編譯的主要觸發(fā)因素是
方法調(diào)用計數(shù)器i;
后柜臺b。向后分支通常表示代碼中的循環(huán)。
每次計數(shù)器達到一定的頻率值(TierXInvokeNotifyFreqLog,TierXBackedgeNotifyFreqLog),編譯政策被稱為決定下一步與當前正在運行的方法做什么。取決于的值i,b而C1和C2的編譯器線程的當前負載,可以決定
繼續(xù)在解釋器中執(zhí)行;
開始分析翻譯;
在第3層使用C1編譯方法,并提供進一步重新編譯所需的完整配置文件數(shù)據(jù);
C1在第2層的編譯方法,沒有概要文件,但有可能重新編譯(不太可能);
最后在第1層使用C1編譯方法,沒有配置文件或計數(shù)器(也是不太可能)。
這里的關鍵參數(shù)是TierXInvocationThreshold和TierXBackEdgeThreshold。可以根據(jù)編譯隊列的長度為給定方法動態(tài)調(diào)整閾值。
編譯隊列不是FIFO,而是優(yōu)先級隊列。
具有概要數(shù)據(jù)(第3層)的C1編譯代碼的行為類似,不同之處在于切換到下一個級別(C2,第4層)的閾值要大得多。例如,解釋的方法可以在調(diào)用約200次后在第3層進行編譯,而C1編譯的方法則需要在調(diào)用5000次以上后在第4層進行重新編譯。
特殊策略用于方法內(nèi)聯(lián)。即使它們不是“熱”的,它們也可以內(nèi)聯(lián)到調(diào)用者中。只有頻繁調(diào)用()時InlineFrequencyRatio,才可以內(nèi)聯(lián)更大的方法InlineFrequencyCount。

TA貢獻1862條經(jīng)驗 獲得超7個贊
控制此的主要參數(shù)是 -XX:CompileThreshold=10000
Java 8熱點現(xiàn)在默認使用分層編譯,默認情況下使用從1級到4級的多個編譯階段。我相信1并不是最優(yōu)化的。級別3為C1(基于客戶端客戶端),級別4為C2(基于服務器編譯器)
這意味著可以比您預期的更早進行一些優(yōu)化,并且可以在達到10K閾值后繼續(xù)進行優(yōu)化。我看到的最高級別是轉義分析,在一百萬次調(diào)用后消除了StringBuilder。
注意:循環(huán)多次會觸發(fā)編譯器。例如,一個10K次的循環(huán)就足夠了。
1)在方法被認為足夠熱之前,將對其進行解釋。但是,某些JVM(例如Azul Zing)可以在啟動時編譯方法,并且您可以強制Hotspot JVM通過內(nèi)部API編譯方法。Java 9可能還具有AOT(提前)編譯器,但AFAIK仍在研究中
2)調(diào)用次數(shù)或迭代次數(shù)。
3)是-XX:CompileThreshold=
的。

TA貢獻1851條經(jīng)驗 獲得超5個贊
您還有其他資料可供我閱讀嗎?我知道C1和C2,但我還沒有聽說過1-4級編譯(Interpeter,C1,C2為3級)。而且,您基本上可以說,在下方可以認為一種方法很熱門CompilerThreshold
。那么這個門檻是多少?我是否可以期待某個方法在被稱為“ Times ”時最晚被認為是熱門方法CompilerThreshold
?
添加回答
舉報