G1 | CMS | |
設計原則 | 首先收集儘量多的垃圾(Garbage First) | 儘量少而塊地執行GC,以停頓時間爲目標 |
垃圾回收時機 | 啓發式算法,在老年代找出具備高收集收益的分區進行收集 | 內存耗盡(新生代)或者快耗盡(老年代) |
內存劃分 | 將內存劃分爲一個個相等大小的內存分區(Region),每一個區域均可能有四種狀態:E(eden)、S(Survial)、O(old)、空閒 | 分爲新生代和老年代2塊連續的內存空間 |
是否產生垃圾碎片 | 將一組或多組區域(稱爲回收集 (CSet))中的存活對象以增量、並行的方式複製到不一樣的新區域來實現壓縮,從而減小堆碎片 |
採用標記刪除,會產生碎片 |
一、G1有一個及其重要的特性:軟實時(soft real-time)。所謂的實時垃圾回收,是指在要求的時間內完成垃圾回收。「軟實時」則是指,用戶能夠指定垃圾回收時間的限時,G1會努力在這個時限內完成垃圾回收,可是G1並不擔保每次都能在這個時限內完成垃圾回收。經過設定一個合理的目標,可讓達到90%以上的垃圾回收時間都在這個時限內。算法
二、動態調節年輕代和總堆的比例。 併發
整個年輕代內存會在初始空間-XX:G1NewSizePercent(默認整堆5%)與最大空間-XX:G1MaxNewSizePercent(默認60%)之間動態變化,
且由參數目標暫停時間-XX:MaxGCPauseMillis(默認200ms)、須要擴縮容的大小以及分區的已記憶集合(RSet)計算獲得。
固然,G1依然能夠設置固定的年輕代大小(參數-XX:NewRatio、-Xmn),但同時暫停目標將失去意義。線程
在Eden充滿時觸發,在回收以後全部以前屬於Eden的區塊全變成空白。而後把剩餘的存活對象移動到S區。設計
不少狀況下,S區的對象會有部分晉升到Old區,另外若是S區已滿、Eden存活的對象會直接晉升到Old區,這種狀況下Old的空間就會漲對象
這個過程會對年輕代的對象有一個短暫的停頓內存
G1併發標記週期能夠分紅幾個階段、其中有些須要暫停應用線程。有些是後臺並行處理,不須要暫停應用io
接下來G1執行一系列的混合GC。這個時期由於會同時進行YGC和清理上面已標記爲X的區域,因此稱之爲混合階段。table
每次混合GC只是清理一部分的O區內存,整個GC會一直持續到幾乎全部的標記區域垃圾對象都被回收,這個階段完了以後G1會從新回到正常的YGC階段。週期性的,當O區內存佔用達到必定數量以後G1又會開啓一次新的並行GC階段.後臺
若是對象內存分配速度過快,mixed gc來不及回收,致使老年代被填滿,就會觸發 一次full gc,G1的full gc算法就是單線程執行的serial old gc,會致使異常長時間的暫停時間,須要進行不斷的調優,儘量的避免full gc.垃圾回收