【JVM】垃圾回收器總結(3)——G1垃圾收集器

G1的特點

除了G1的其餘垃圾回收器的特點是,年輕代和老年代是各自獨立且連續的內存塊,年輕代收集使用單edn+s0+s1進行復制算法,老年代收集必須掃描整個老年代區域。都是以儘可能少而快速地執行GC爲設計原則。

 

G1是一款面向服務端應用的收集器,應用在多CPU和大容量內存的環境中,在實現高吞吐量的同時,儘可能減少GC回收的時間(STW的時間)它和CMS一樣,可以和應用線程併發執行。並且具有以下特性:

  1. 整理空閒空間的速度更快
  2. 需要更多的時間來預測GC停頓時間
  3. 不希望犧牲大量的吞吐性能
  4. 不需要更大的Java堆內存

G1橫跨老年代和年輕代,G1的垃圾回收日誌記錄上只有G1heap和元空間。G1的收集目的是取代CMS收集器,與CMS相比它有一個整理內存的過程,所以不會產生大量的內存碎片。而且G1的STW是可控的,G1在停頓時間上加了預測機制,用戶可以指定期望的停頓時間。

CMS雖然減少了STW的時間,但是存在內存碎片的問題。G1很好的保留了CMS的STW時間短的優點,同時又去除了內存碎片的問題。JDK1.7u4發佈後G1可以開始使用。Java9將G1作爲默認垃圾回收器體改CMS。

 

 

G1的底層原理

 

G1算法將堆劃分成若干區域,仍然屬於分代收集器。區域一部分是老年代,一部分是新生代。新生代的垃圾回收器依然採用STW的方式,將存活的對象拷貝到倖存區或者老年代。G1收集器通過將對象從一個區域複製到另一個區域完成了清理工作,在正常的處理過程中,G1完成了堆的壓縮,從而不會存在內存碎片的問題。

G1的回收步驟:

  1. 初始標記:只標記GC Roots能關聯到的對象
  2. 併發標記:進行GC Roots Tracing的過程
  3. 最終標記:修正併發標記期間,因爲程序運行導致標記變化的那部分對象。
  4. 篩選回收:根據時間來進行價值最大化的回收(儘可能減少內存碎片,獲得連續的內存空間)

 

 

總結

G1可以重複利用多CPU、多核環境硬件優勢來減少STW。整體上採用標記整理算法,局部採用複製算法,不會產生內存碎片。宏觀上來看宏觀上看,G1中不再區分年輕代和老年代,不再是物理隔離的,它把內存劃分成多個獨立的子區域。但是G1仍在邏輯上具有分代的概念,每個分區可能隨G1的運行在不同代之間切換。G1雖然也是分代收集器,但是整個內存區不存在物理上的老年代和年輕代的區別,不需要完全獨立的to區做複製準備。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章