一、和CMS對比
G1 | CMS | |
設計原則 | 首先收集盡可能多的垃圾(Garbage First) | 盡可能少而塊地執行GC,以停頓時間為目標 |
垃圾回收時機 | 啟發式算法,在老年代找出具有高收集收益的分區進行收集 | 內存耗盡(新生代)或者快耗盡(老年代) |
內存划分 | 將內存划分為一個個相等大小的內存分區(Region),每個區域都可能有四種狀態:E(eden)、S(Survial)、O(old)、空閑 | 分為新生代和老年代2塊連續的內存空間 |
是否產生垃圾碎片 | 將一組或多組區域(稱為回收集 (CSet))中的存活對象以增量、並行的方式復制到不同的新區域來實現壓縮,從而減少堆碎片 |
采用標記刪除,會產生碎片 |
二、技術細節
1、G1有一個及其重要的特性:軟實時(soft real-time)。所謂的實時垃圾回收,是指在要求的時間內完成垃圾回收。“軟實時”則是指,用戶可以指定垃圾回收時間的限時,G1會努力在這個時限內完成垃圾回收,但是G1並不擔保每次都能在這個時限內完成垃圾回收。通過設定一個合理的目標,可以讓達到90%以上的垃圾回收時間都在這個時限內。
2、動態調節年輕代和總堆的比例。
整個年輕代內存會在初始空間-XX:G1NewSizePercent(默認整堆5%)與最大空間-XX:G1MaxNewSizePercent(默認60%)之間動態變化,
且由參數目標暫停時間-XX:MaxGCPauseMillis(默認200ms)、需要擴縮容的大小以及分區的已記憶集合(RSet)計算得到。
當然,G1依然可以設置固定的年輕代大小(參數-XX:NewRatio、-Xmn),但同時暫停目標將失去意義。
三、垃圾回收過程
YoungGC:
YoungGC並不是說現有的Eden區放滿了就會馬上觸發,G1會計算下現在Eden區回收大概要多久時間,如果回收時間遠遠小於參數 -XX:MaxGCPauseMills 設定的值,那么增加年輕代的region,繼續給新對象存放,不會馬上做YoungGC,直到下一次Eden區放滿,G1計算回收時間接近參數 -XX:MaxGCPauseMills 設定的值,那么就會觸發YoungGC
MixedGC:
不是FullGC,老年代的堆占有率達到參數(-XX:InitiatingHeapOccupancyPercen)設定的值則觸發,回收所有的Young和部分Old(根據期望的GC停頓時間確定old區垃圾收集的優先順序)以及大對象區,正常情況G1的垃圾收集是先做MixedGC,主要使用復制算法,需要把各個region中 存活的對象拷貝到別的region里去,拷貝過程中如果發現沒有足夠的空region能夠承載拷貝對象 就會觸發一次Full GC
Full GC:
停止系統程序,然后采用單線程進行標記、清理和壓縮整理,好空閑出來一批Region來供下一次MixedGC使用,這個過程是非常耗時的。