JVM進入老年代情況


1.躲過15次GC之后進入老年代

默認的設置下,當對象的年齡達到15歲的時候,也就是躲過15次Gc的時候,他就會轉移到老年代中去

這個具體是多少歲進入老年代,可以通過JVM參數 “-XX:MaxTenuringThreshold”來設置,默認情況是15歲

2.動態對象年齡判斷

假如說當前放對象的Survivor區域里一批對象的總大小大於了這塊Survivor區域的內存大小的50%,那么此時大於等於這批對象年齡的對象,就可以直接進入老年代了

另外我們要理清楚一個概念,這個實際這個規則運行的時候是如下的邏輯:年齡1+年齡2+年齡n的多個年齡對象總和超過了Survivor區域的50%,此時就會把年齡n以上的對象都放入老年代

 

在沒有回收的情況下 所有對象存活着
比如說一塊s區塊 100M 如果第一次有20M 不到老年代 第二次來了51M存活 如果之前的20M全部存活,那么這51M和20M將全部到老年代

另外一種情況 在這3次的對象都持續引用,不能回收的情況下,比如說一塊s區塊 100M 如果第一次有10M 不到老年代 第二次20M 第三次 31M 那么就會由於20+31>50了 那么第一次的10M就會到老年代了。

3.大對象直接進入老年代

有一個JvM參數,就是 -XX:PretenureSizeThreshold“,可以把他的值設置為字節數,比如“1048576”,就是1M

如果你創建一個大於這個大小的對象,比如一個超大的數組,或者是別的啥東西,此時就直接把這個大對象放在老年代中,壓根不會經過新生代,這樣可以避免新生代出現那種大對象,然后在2個Survivor區域里回來復制多次之后才能進入老年代

4.MinorGC后的對象太多無法放入Survivor區怎么辦?

如果在Minor GC之后發現剩余的存活對象太多了,沒辦法放入另外一塊Survivor,那么這個時候就必須得把這些對象直接轉移到老年代中去

5.老年代空間分配擔保規則

在執行任何一次Minor GC之前,JVM會檢查一下老年代可用的可用內存空間,是否大於新生代所有對象的總大小

為啥會檢查這個呢?因為最極端的情況下,可能新生代的Minor GC過后,所有對象都存活下來了,那豈不是新生代所有對象全部都要進入老年代?

如果說發現老年代的內存大小是大於新生代所有對象的,此時就可以放心大膽的對新生代發起一次Minor GC了,也可以轉移到老年代去。

但是假如執行Minor GC之前,發現老年代的可用內存已經小於了新生代的全部對象大小了,那么這個時候是不是有可能在Minor GC之后新生代的對象全部存活下來,然后全部需要轉移到老年代去,但是老年代空間又不夠?

所以假如Minor Gc之前,發現老年代的可用內存已經小於看新生代的全部對象大小了,就會看一個-XX:-HandlePromotionFailure的參數是否設置了,如果有這個參數,那么就會繼續進行下一步判斷,

下一步判斷,就是看老年代的內存大小,是否大於之前每一次Minor GC后進入老年代的對象的平均大小。

舉個例子,之前每次Minor GC后,平均都有10MB左右的對象會進入老年代,那么此時老年代可用內存大於10MB

這就說明很可能這次Minor GC過后也是差不多10MB左右的對象會進入老年代,此時老年代空間是夠的

如果上面那個步驟判斷失敗了,或者是 -XX:-HandlePromotionFailure“參數沒設置,此時就會直接觸發一次Full GC,就是對老年代進行垃圾回收,盡量騰出來一些內存空間,然后再執行Minor GC 

如果上面2個步驟都判斷成功了,那么就是說可以冒點風險嘗試一下Minor GC 此時進行Minor GC,此時進行Minor GC有幾種可能:

(1)Minor GC過后,剩余的存活對象的大小,是小於Survivor區的大小的,那么此時存活對象進入Survicor區域即可

 (2)Minor GC過后,剩余的存活對象的大小是大於Survivor區域的大小,但是是小於老年代可用內存大小的,此時就直接進入老年代即可

(3)Minor GC過后,剩余的存活對象的大小,大於了Survivor區域的大小,也大於了老年代可用內存的大小,此時老年代都放不下這些存活對象了,就會發生Handle Promotion Failure的情況,這個時候就會觸發一次Full GC

Full GC就是對老年代進行垃圾回收,同時也一般會對新生代進行垃圾回收。

因為這個時候必須把老年代理的沒人引用的對象給回收掉,然后才可能讓Minor GC過后剩余的存活對象進入老年代里面

如果要Full GC過后,老年代還是沒有足夠的空間存放Minor GC過后的剩余存活對象,那么此時就會導致所謂的OOM內存溢出了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM