熱點(diǎn)檢測(cè)
?自適應(yīng)優(yōu)化通過(guò)利用有趣的程序?qū)傩越鉀Q了JIT編譯的問(wèn)題。實(shí)際上震缭,所有程序都將大部分時(shí)間都花在執(zhí)行少量代碼上赂毯。Java HotSpot VM不會(huì)立即編譯方法,而是立即使用解釋器運(yùn)行程序拣宰,并在運(yùn)行時(shí)分析代碼以檢測(cè)程序中的關(guān)鍵熱點(diǎn)党涕。然后,它將本地代碼優(yōu)化器的注意力集中在熱點(diǎn)上巡社。通過(guò)避免不經(jīng)常執(zhí)行的代碼(程序的大部分)的編譯膛堤,Java HotSpot編譯器可以將更多的注意力放在程序的性能關(guān)鍵部分上,而不必增加總的編譯時(shí)間重贺。隨著程序的運(yùn)行骑祟,熱點(diǎn)監(jiān)視將動(dòng)態(tài)地繼續(xù)進(jìn)行回懦,
?這種方法的一個(gè)微妙但重要的好處是,通過(guò)將編譯延遲到代碼執(zhí)行了一段時(shí)間之后(以機(jī)器時(shí)間而非用戶時(shí)間來(lái)衡量)次企,可以收集有關(guān)代碼使用方式的信息怯晕,然后加以利用進(jìn)行更智能的優(yōu)化。同樣缸棵,減少了內(nèi)存占用舟茶。除了在程序中收集有關(guān)熱點(diǎn)的信息外,還會(huì)收集其他類型的信息堵第,例如有關(guān)用于虛擬方法調(diào)用的主叫方關(guān)系的數(shù)據(jù)吧凉。
參考官方鏈接:https://www.oracle.com/java/technologies/whitepaper.html#method
方法內(nèi)聯(lián)
?Java編程語(yǔ)言中虛擬方法調(diào)用的頻率是重要的優(yōu)化瓶頸。一旦Java HotSpot自適應(yīng)優(yōu)化器在執(zhí)行期間收集了有關(guān)程序熱點(diǎn)的信息踏志,它不僅將熱點(diǎn)編譯為本機(jī)代碼阀捅,而且還會(huì)對(duì)該代碼執(zhí)行大量的方法內(nèi)聯(lián)。
?內(nèi)聯(lián)具有重要的好處针余。它大大降低了方法調(diào)用的動(dòng)態(tài)頻率饲鄙,從而節(jié)省了執(zhí)行這些方法調(diào)用所需的時(shí)間。但更重要的是圆雁,內(nèi)聯(lián)會(huì)產(chǎn)生更大的代碼塊忍级,以供優(yōu)化程序使用。這就產(chǎn)生了一種情況伪朽,大大提高了傳統(tǒng)編譯器優(yōu)化的效率轴咱,克服了提高Java編程語(yǔ)言性能的主要障礙。
?內(nèi)聯(lián)與其他代碼優(yōu)化具有協(xié)同作用烈涮,因?yàn)樗顾鼈兏行臃巍kS著Java HotSpot編譯器的成熟,對(duì)大型內(nèi)聯(lián)代碼塊進(jìn)行操作的能力將為將來(lái)的許多更高級(jí)的優(yōu)化打開(kāi)大門(mén)跃脊。
參考官方鏈接:https://www.oracle.com/java/technologies/whitepaper.html#method
方法內(nèi)聯(lián)個(gè)人筆記:Java 方法內(nèi)聯(lián)
動(dòng)態(tài)反優(yōu)化
?內(nèi)聯(lián)是一項(xiàng)重要的優(yōu)化宇挫,但是傳統(tǒng)上苛吱,對(duì)于像Java語(yǔ)言這樣的面向動(dòng)態(tài)對(duì)象的語(yǔ)言酪术,執(zhí)行內(nèi)聯(lián)一直非常困難。此外翠储,盡管檢測(cè)熱點(diǎn)并內(nèi)聯(lián)它們調(diào)用的方法非常困難绘雁,但仍不足以提供完整的Java編程語(yǔ)言語(yǔ)義。這是因?yàn)橛肑ava語(yǔ)言編寫(xiě)的程序不僅可以即時(shí)更改方法調(diào)用的模式援所,而且還可以將新的Java代碼動(dòng)態(tài)地加載到正在運(yùn)行的程序中庐舟。
?內(nèi)聯(lián)基于全局分析的形式。動(dòng)態(tài)加載顯著使內(nèi)聯(lián)復(fù)雜化住拭,因?yàn)樗牧顺绦蛑械娜株P(guān)系挪略。新類可能包含需要在適當(dāng)位置內(nèi)聯(lián)的新方法历帚。因此,即使在執(zhí)行針對(duì)熱點(diǎn)的代碼時(shí)杠娱,Java HotSpot VM也必須能夠動(dòng)態(tài)地取消優(yōu)化(然后在必要時(shí)重新優(yōu)化)先前優(yōu)化的熱點(diǎn)挽牢。如果沒(méi)有此功能,就無(wú)法在基于Java技術(shù)的程序上安全地執(zhí)行常規(guī)內(nèi)聯(lián)摊求。
參考官方鏈接:https://www.oracle.com/java/technologies/whitepaper.html#method