目錄
本文主要參考狸貓技術窩文章
之前的文章https://blog.csdn.net/e5yrt2/article/details/105540664,大致介紹了JVM相關的垃圾回收器,有CMS、PreNew和G1垃圾回收器。而G1(GarbageFirst)是性能最好,同樣也是jdk9默認的垃圾回收器。
G1回收器模型
那麼有多少Region?每個Region又有多大?
因爲新生代和老年代都會被Region管理,默認來說,Region的大小爲分配的堆內存的大小除以2048。
比如分配的堆內存爲4G,那麼分配到每個Region的大小爲2MB。
新生代Region分配
JVM中有-XX:G1NewSizePercent 這個配置用來設置初始化時候新生代的比例的。
新生代如何進行垃圾回收?
假設新生代默認分配的是堆內存的60%,那麼新生代約佔有1200個Region,S1和S2分別有100,具體分配如下圖
這時候觸發新生代的GC,G1就會用之前說過的複製算法來進行垃圾回收,進入一個“Stop the World”狀態,然後把Eden對應的Region中的存活對象放入S1對應的Region中,接着回收掉Eden對應的Region中的垃圾對象 。這個跟之前的回收方式一致。
新生代進入老年代
進入老年代的條件跟原有的一致
1、躲過多次垃圾回收後進入老年代
2、MinorGC後存活對象超過S區的50%
大對象問題?
之前的方案中,大對象會被直接分配到老年代。而在G1回收器中,大對象可以橫跨多個Region存放,如下圖。