G1中提供了三種模式垃圾回收模式,young gc、mixed gc 和 full gc
發生在年輕代的GC算法,一般對象(除了巨型對象)都是在eden region中分配內存,當所有eden region被耗盡無法申請內存時,就會觸發一次young gc
參數 |
含義 |
-XX:MaxGCPauseMillis |
設置G1收集過程目標時間,默認值200ms |
-XX:G1NewSizePercent |
新生代最小值,默認值5% |
-XX:G1MaxNewSizePercent |
新生代最大值,默認值60% |
當越來越多的對象晉升到老年代old region時,為了避免堆內存被耗盡,虛擬機會觸發一個混合的垃圾收集器,即mixed gc,mixed gc中也有一個閾值參數 -XX:InitiatingHeapOccupancyPercent,當老年代大小占整個堆大小百分比達到該閾值時,會觸發一次mixed gc.
mixed gc的執行過程有點類似cms,主要分為以下幾個步驟:
1. initial mark: 初始標記過程,整個過程STW,標記了從GC Root可達的對象
2. concurrent marking: 並發標記過程,整個過程gc collector線程與應用線程可以並行執行,標記出GC Root可達對象衍生出去的存活對象,並收集各個Region的存活對象信息
3. remark: 最終標記過程,整個過程STW,標記出那些在並發標記過程中遺漏的,或者內部引用發生變化的對象
4. clean up: 垃圾清除過程,如果發現一個Region中沒有存活對象,則把該Region加入到空閑列表中
如果對象內存分配速度過快,mixed gc來不及回收,導致老年代被填滿,就會觸發一次full gc,G1的full gc算法就是單線程執行的serial old gc,會導致異常長時間的暫停時間,需要進行不斷的調優,盡可能的避免full gc.