虛擬機並非永遠地要求對象的年齡必須達到了MaxTenuringThreshold才能晉升老年代,若是在Survivor空間中相同年齡全部對象大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無須等到MaxTenuringThreshold中要求的年齡。c++
學習jvm的人,基本都閱讀過上面這段話,這裏講的是動態年齡的斷定。對於動態的斷定的條件就是相同年齡全部對象大小的總和大於Survivor空間的一半,而後算出的年齡要和MaxTenuringThreshold的值進行比較,以此保證MaxTenuringThreshold設置太大(默認15),致使對象沒法晉升。數組
若是說非得相同年齡全部對象大小總和大於Survivor空間的一半才能晉升。咱們看下面的場景jvm
Survivor都佔用了100%了,可是對象就不晉升。致使老年代明明有空間,可是對象就停留在年輕代。但這個結論彷佛與jvm的表現不符合,只要老年代有空間,最後還會晉升的。學習
<code class="language-c++">uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空間的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes數組是每一個年齡段對象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }
我把晉升年齡計算的代碼摘出。咱們來看看動態年齡的計算。代碼中有一個TargetSurvivorRatio的值。ui
-XX:TargetSurvivorRatio 目標存活率,默認爲50%.net
整體表徵就是,年齡從小到大進行累加,當加入某個年齡段後,累加和超過survivor區域*TargetSurvivorRatio的時候,就從這個年齡段網上的年齡的對象進行晉升。code
仍是上面的場景。 年齡1的佔用了33%,年齡2的佔用了33%,累加和超過默認的TargetSurvivorRatio(50%),年齡2和年齡3的對象都要晉升。對象
動態對象年齡判斷,主要是被TargetSurvivorRatio這個參數來控制。並且算的是年齡從小到大的累加和,而不是某個年齡段對象的大小。看完後先記住這個參數吧TargetSurvivorRatio,雖然你之後基本不會調整他。blog