虛擬機器並不是永遠地要求物件的年齡必須達到了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通過這個比率來計算乙個期望值,desired_survivor_size 。目標存活率,預設為50%
然後用乙個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位元組碼一次編譯為機器碼,然 後一次性執行所...