3 回答

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

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

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