jvm 基礎(chǔ)篇-(4)-對(duì)象動(dòng)態(tài)年齡計(jì)算規(guī)則

image.png

還沒達(dá)到,大牛程度,可以看源碼,看動(dòng)態(tài)計(jì)算對(duì)象年齡的程度呦~

動(dòng)態(tài)年齡計(jì)算規(guī)則:

默認(rèn)規(guī)則:

-XX:MaxTenuringThreshold=X X默認(rèn)是15,15的含義是從eden-->survivor 對(duì)象年齡+1,survivor-->eden 對(duì)象年齡+1,直到年齡達(dá)到15后開始進(jìn)入old Generation。

動(dòng)態(tài)規(guī)則:

Hotspot遍歷所有對(duì)象時(shí),按照年齡從小到大對(duì)其所占用的大小進(jìn)行累積,當(dāng)累積的某個(gè)年齡大小超過了survivor區(qū)的一半時(shí),取這個(gè)年齡和MaxTenuringThreshold中更小的一個(gè)值,作為新的晉升年齡閾值。
eg:
eg:Survivor區(qū) = 64M,desired survivor = 32M,此時(shí)Survivor區(qū)中age<=2的對(duì)象累計(jì)大小為41M,41M大于32M,所以晉升年齡閾值被設(shè)置為2,下次Minor GC時(shí)將年齡超過2的對(duì)象被晉升到老年代。就會(huì)導(dǎo)致old generation 快速填滿,觸發(fā)old gc(old gc 有三處STW),所以這是建議調(diào)整-XX:SurvivorRatio參數(shù)。

JVM引入動(dòng)態(tài)年齡計(jì)算,主要基于如下兩點(diǎn)考慮:

1、如果固定按照MaxTenuringThreshold設(shè)定的閾值作為晉升條件: a)MaxTenuringThreshold設(shè)置的過大,原本應(yīng)該晉升的對(duì)象一直停留在Survivor區(qū),直到Survivor區(qū)溢出,一旦溢出發(fā)生,Eden+Svuvivor中對(duì)象將不再依據(jù)年齡全部提升到老年代,這樣對(duì)象老化的機(jī)制就失效了。 b)MaxTenuringThreshold設(shè)置的過小,“過早晉升”即對(duì)象不能在新生代充分被回收,大量短期對(duì)象被晉升到老年代,老年代空間迅速增長(zhǎng),引起頻繁的Major GC。分代回收失去了意義,嚴(yán)重影響GC性能。

2、相同應(yīng)用在不同時(shí)間的表現(xiàn)不同:特殊任務(wù)的執(zhí)行或者流量成分的變化,都會(huì)導(dǎo)致對(duì)象的生命周期分布發(fā)生波動(dòng),那么固定的閾值設(shè)定,因?yàn)闊o法動(dòng)態(tài)適應(yīng)變化,會(huì)造成和上面相同的問題。

總結(jié)來說,為了更好的適應(yīng)不同程序的內(nèi)存情況,虛擬機(jī)并不總是要求對(duì)象年齡必須達(dá)到Maxtenuringthreshhold再晉級(jí)老年代。

傳送門jvm-對(duì)象年齡(-XX:+PrintTenuringDistribution)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容