jvm誤區 動態物件年齡判定

2021-10-03 01:51:04 字數 1460 閱讀 9598

虛擬機器並不是永遠地要求物件的年齡必須達到了maxtenuringthreshold才能晉公升老年代,如果在survivor空間中相同年齡所有物件大小的總和大於survivor空間的一半,年齡大於或等於該年齡的物件就可以直接進入老年代,無須等到maxtenuringthreshold中要求的年齡。

學習jvm的人,基本都閱讀過上面這段話,這裡講的是動態年齡的判定。對於動態的判定的條件就是相同年齡所有物件大小的總和大於survivor空間的一半,然後算出的年齡要和maxtenuringthreshold的值進行比較,以此保證maxtenuringthreshold設定太大(預設15),導致物件無法晉公升。

如果說非得相同年齡所有物件大小總和大於survivor空間的一半才能晉公升。我們看下面的場景

maxtenuringthreshold為15

年齡1的物件占用了33%

年齡2的物件占用33%

年齡3的物件占用34%。

按照晉公升的標準。首先年齡不滿足maxtenuringthreshold,不會晉公升。

每個年齡的物件都不滿足50%。,不會晉公升。

survivor都占用了100%了,但是物件就不晉公升。導致老年代明明有空間,但是物件就停留在年輕代。但這個結論似乎與jvm的表現不符合,只要老年代有空間,最後還會晉公升的。

uint agetable::compute_tenuring_threshold(size_t survivor_capacity) 

uint result = age < maxtenuringthreshold ? age : maxtenuringthreshold;

...}

我把晉公升年齡計算的**摘出。我們來看看動態年齡的計算。**中有乙個targetsurvivorratio的值。

-xx:targetsurvivorratio

目標存活率,預設為50%

通過這個比率來計算乙個期望值,desired_survivor_size 。

然後用乙個total計數器,累加每個年齡段物件大小的總和。

當total大於desired_survivor_size 停止。

然後用當前age和maxtenuringthreshold 對比找出最小值作為結果

總體表徵就是,年齡從小到大進行累加,當加入某個年齡段後,累加和超過survivor區域*targetsurvivorratio的時候,就從這個年齡段網上的年齡的物件進行晉公升。

還是上面的場景。

年齡1的占用了33%,年齡2的占用了33%,累加和超過預設的targetsurvivorratio(50%),年齡2和年齡3的物件都要晉公升。

動態物件年齡判斷,主要是被targetsurvivorratio這個引數來控制。而且算的是年齡從小到大的累加和,而不是某個年齡段物件的大小。看完後先記住這個引數吧targetsurvivorratio,雖然你以後基本不會調整他。

jvm誤區 動態物件年齡判定

虛擬機器並不是永遠地要求物件的年齡必須達到了maxtenuringthreshold才能晉公升老年代,如果在survivor空間中相同年齡所有物件大小的總和大於survivor空間的一半,年齡大於或等於該年齡的物件就可以直接進入老年代,無須等到maxtenuringthreshold中要求的年齡。學...

JVM 物件分配

1 xmn 新生代記憶體上限值 2 xms 整個堆區初始記憶體分配的大小 3 xmx 堆區記憶體的最大分配大小 4 xx survivorratio 決定eden與乙個survivor大小之比 5 xx pretenuresizethreshold 大物件直接放入老年代,避免在eden區和兩個sur...

JVM物件逃逸分析 JVM記憶體

jvm的執行模式有三種 解釋模式 interpreted mode 只使用直譯器 xint 強制jvm使用解釋模式 執行一行jvm位元組碼就編譯一行為機器碼 編譯模式 compiled mode 只使用編譯器 xcomp jvm使用編譯模式 先將所有jvm位元組碼一次編譯為機器碼,然 後一次性執行所...