你这样的“垃圾“,就应该进入老年代!!!
什么樣的垃圾會進入到老年代?對象進入老年代的條件有三個,滿足一個就會進入到老年代,
- 1、躲過15次GC。每次垃圾回收后,存活的對象的年齡就會加1,累計加到15次(jdk8默認的),也就是某個對象躲過了15次垃圾回收,那么JVM就認為這個是經常被使用的對象,就沒必要再帶著年輕代中了。具體的次數可以通過 -XX:MaxTenuringThreshold 來設置在躲過多少次垃圾收集后進去老年代。
- 2、動態對象年齡判斷。規則:在某個 Survivor 中,如果有一批對象的大小總是大于該 Survivor 的 50%,那么此時大于等于該批對象年齡的對象機會會直接到老年代中。
- 3、大對象直接進入老年代。-XX:PretenureSizeThreshold 來設置大對象的臨界值,大于該值的就被認為是大對象,就會直接進入老年代。
針對上面的三點來逐一分析:
躲過15次 GC
這個沒啥好說的,最好理解,就是在執行了15次GC后,對象依舊存活,那么就將其移動到老年代中去,沒執行一次垃圾回收,存活的對象的年齡就+1,具體的執行次數可以通過:-XX:PretenureSizeThreshold參數來設置。
動態對象年齡判斷
這就有點難理解了,不過在我 xx 面前,就一定會給你講清楚。
再來看下這個規則:在某個 Survivor 中,如果有一批對象的大小總是大于該 Survivor 的 50%,那么此時大于等于該批對象年齡的對象機會會直接到老年代中。
o(╥﹏╥)o 還是沒理解。。。我們畫圖來理解試試
假設現在 To 里面的如圖兩個對象大小總和50 M,且都是3歲了,因為 To 是100 M,所以這個時候我們就說在某個 Survivor 中,如果有一批對象的大小總是大于該Survivor 的 50%。這個時候大于等于該批對象年齡的對象機會會直接到老年代中。
再還換句話說就是:當前放對象的Survivor區域里(其中一塊區域,放對象的那塊s區),一批對象的總大小大于這塊Survivor區域內存大小的50%(-XX:TargetSurvivor 修可以指定),那么此時大于等于這批對象年齡最大值的對象,就可以直接進入老年代了。
例如Survivor區域里現在有一比對象,年齡1+年齡2+年齡n的多個年齡對象總和超過了的多個年齡對象總和超過了區域的50%,此時就會巴年齡n(含)以上的對象都放入老年代)。這個規則其實是希望那些可能是長期存活的對象,盡早進入老年代。對象動態年齡判斷機制一般是在 Minor GC 之后觸發的。
大對象直接進入老年代
這個就簡單了,-XX:PretenureSizeThreshold 來設置大對象的臨界值。如 -XX:PretenureSizeThreshold=1024 * 1024。即對象超過1M直接進入老年代。其實大對象直接進入到老年代還包含這種情況:那就是當 Eden 中執行了 Minor GC 后,存活的對象的大小是 超過了100M了(上圖 from 和 to 都是100M)此時這些存活的對象也是直接進入到老年代。
說了半天對象都跑到老年代去了,那既然老年代這個牛逼,干嘛還分年輕代和老年代?年輕人,你不要急。后文我會全部道來。我們下面先來看看老年代空間如果不夠用怎么辦?
總結
以上是生活随笔為你收集整理的你这样的“垃圾“,就应该进入老年代!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2-2 工程源码文件结构
- 下一篇: 「面试」美团肝了我30+问题