【JVM】G1垃圾收集器深刻分析

1、和CMS對比

  G1 CMS
設計原則 首先收集儘量多的垃圾(Garbage First) 儘量少而塊地執行GC,以停頓時間爲目標
垃圾回收時機  啓發式算法,在老年代找出具備高收集收益的分區進行收集  內存耗盡(新生代)或者快耗盡(老年代)
 內存劃分 將內存劃分爲一個個相等大小的內存分區(Region),每一個區域均可能有四種狀態:E(eden)、S(Survial)、O(old)、空閒  分爲新生代和老年代2塊連續的內存空間
 是否產生垃圾碎片
將一組或多組區域(稱爲回收集 (CSet))中的存活對象以增量、並行的方式複製到不一樣的新區域來實現壓縮,從而減小堆碎片
採用標記刪除,會產生碎片 

2、技術細節

一、G1有一個及其重要的特性:軟實時(soft real-time)。所謂的實時垃圾回收,是指在要求的時間內完成垃圾回收。「軟實時」則是指,用戶能夠指定垃圾回收時間的限時,G1會努力在這個時限內完成垃圾回收,可是G1並不擔保每次都能在這個時限內完成垃圾回收。經過設定一個合理的目標,可讓達到90%以上的垃圾回收時間都在這個時限內。算法

二、動態調節年輕代和總堆的比例。 併發

G1能夠根據用戶設置的暫停時間目標自動調全年輕代和總堆大小,暫停目標越短年輕代空間越小、總空間就越大;

整個年輕代內存會在初始空間-XX:G1NewSizePercent(默認整堆5%)與最大空間-XX:G1MaxNewSizePercent(默認60%)之間動態變化,
且由參數目標暫停時間-XX:MaxGCPauseMillis(默認200ms)、須要擴縮容的大小以及分區的已記憶集合(RSet)計算獲得。
固然,G1依然能夠設置固定的年輕代大小(參數-XX:NewRatio、-Xmn),但同時暫停目標將失去意義。線程

3、垃圾回收過程

一、YGC

在Eden充滿時觸發,在回收以後全部以前屬於Eden的區塊全變成空白。而後把剩餘的存活對象移動到S區。設計

不少狀況下,S區的對象會有部分晉升到Old區,另外若是S區已滿、Eden存活的對象會直接晉升到Old區,這種狀況下Old的空間就會漲對象

這個過程會對年輕代的對象有一個短暫的停頓內存

二、併發標記階段

G1併發標記週期能夠分紅幾個階段、其中有些須要暫停應用線程。有些是後臺並行處理,不須要暫停應用io

  1. 初始標記。須要暫停應用線程這個階段會暫停全部應用線程。部分緣由是這個過程會執行一次YGC
  2. 併發掃描。後臺線程並行處理,不會暫停應用
  3. 併發標記。在root掃描完成後,G1進入了一個併發標記階段。這個階段也是徹底後臺進行的
  4. 併發標記階段是能夠被打斷的,好比這個過程當中發生了YGC就會。這個階段以後會有一個二次標記階段和清理階段。這兩個階段一樣會暫停應用線程,但時間很短。接下來還有額外的一次併發清理階段

三、混合GC

接下來G1執行一系列的混合GC。這個時期由於會同時進行YGC和清理上面已標記爲X的區域,因此稱之爲混合階段。table

每次混合GC只是清理一部分的O區內存,整個GC會一直持續到幾乎全部的標記區域垃圾對象都被回收,這個階段完了以後G1會從新回到正常的YGC階段。週期性的,當O區內存佔用達到必定數量以後G1又會開啓一次新的並行GC階段.後臺

四、FullGC

若是對象內存分配速度過快,mixed gc來不及回收,致使老年代被填滿,就會觸發 一次full gc,G1的full gc算法就是單線程執行的serial old gc,會致使異常長時間的暫停時間,須要進行不斷的調優,儘量的避免full gc.垃圾回收

相關文章
相關標籤/搜索