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


一、和CMS對比

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

二、技術細節

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

2、動態調節年輕代和總堆的比例。 

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

整個年輕代內存會在初始空間-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使用,這個過程是非常耗時的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM