垃圾回收(4)G1的GC過程

G1日誌

G1有詳細的日誌信息,建議使用下面的參數,當G1出問題,能夠獲取不少有用的信息算法

一、-xx:+PrintGCDateStamps 打印日期和正常雲行時間
二、-xx:+PrintGCDetails 打印G1詳細信息
三、-xx:+PrintAdaptiveSizePolicy 打印自適應調節策略;自適應策略:GC會根據中統計的GC時間、吞吐量、內存佔用量,從新計算堆內存中各區大小
四、-xx:+PrintTenuringDistribution 打印survivor region區域內的對象的age信息多線程

GC過程

一、年輕代GC

一、年輕代收集會,不會進行併發標記,因此它全程都是STW
二、應用線程不斷活動後,年輕代空間會被逐漸填滿。當JVM分配對象到Eden區域失敗(Eden區已滿)時,便會觸發一次STW式的年輕代收集併發

工做過程

一、根掃描 Root Scanning:靜態和本地對象等被掃描
二、更新已記憶集合 Update RSet:對dirty卡片的分區進行掃描,來更新RSet
三、RSet掃描:在收集當前CSet以前,掃描CSet分區的RSet,檢測old->young這種引用狀況
四、轉移和回收-Object Copy:將CSet分區存活對象的轉移到新survivor或old Region,回收CSet內垃圾對象
五、引用處理:主要針對軟引用、弱引用、虛引用、final引用、JNI引用;當佔用時間過多時,可選擇使用參數-XX:+ParallelRefProcEnabled激活多線程引用處理
六、在年輕代收集中,Eden分區存活的對象將被拷貝到Survivor分區;原有Survivor分區存活的對象,將根據對象的年齡而晉升到新的survivor分區和老年代分區。而原有的年輕代分區將被總體回收掉。ide

二、老年代GC

一、當堆內存佔用空間超過整堆比IHOP閾值-XX:InitiatingHeapOccupancyPercent(默認45%)時,G1就會進行年老代收集線程

1.一、在年輕代收集以後或巨型對象分配以後,會去檢查這個空間佔比
1.二、年輕代晉升老年代失敗會觸發老年代GC或者Full GC日誌

二、年老代收集同時會執行年輕代收集,進行年老代的roots探測,既初始標記,STW的過程
三、併發標記
四、從新標記,STW的過程,這個過程使用STAB算法。
五、清除垃圾,STW的過程。對象

三、混合GC

一、在進行正常的年輕代垃圾收集,也會回收一部分老年代分區。會優先選取垃圾多(垃圾佔用大於85%,複製算法存活對象越少效率越高)的Regions,一共1/8的年老代Regions加入Cset中
二、假設一個Region的存活對象達到95%,而進行復制,效率很低,因此G1容許浪費部份內存,那麼這個Region不會被混合收集,-XX:G1HeapWastePercent:默認5%
三、stw,而後將Cset中的Regions進行收集,使用複製算法
四、下一次年輕代垃圾收集進行時,在將第二個1/8的年老代Regions加入Cset中進行收集
當年老代內單個Region的垃圾小於等於G1HeapWastePercent時,複製大量存活對象,效率很低。此時G1會肯定結束混合收集週期。因此混合收集次數可能小於8次。內存

四、Full GC

STW式的、單線程的Full GC。Full GC會對整堆作標記清除和壓縮,最後將只包含純粹的存活對象。it

總結

具體執行過程當中的細節,後面梳理以後再補充~~~~io

相關文章
相關標籤/搜索