[JVM 相關] Java 新型垃圾回收器(Garbage First,G1)

回顧傳統垃圾回收器

  • HotSpot 垃圾收集器實現算法

    • Serial Collector(串型收集器)服務器

      使用場景,大多數服務器是單核CPU。數據結構

      適用收集場景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)併發

    • Parallel Conllector(並行收集器)佈局

      又叫吞吐量收集器(throughput collector)應用於多核系統。.net

      適用收集場景:1. 新生代收集是並行處理。2. 老年代收集和Serial Collector同樣。code

    • Parallel Compacting Collector(並行壓縮收集器)對象

      The parallel compacting collector was introduced in J2SE 5.0 update 6. The difference between it and the parallel collector is that it uses a new algorithm for old generation garbage collection.內存

      Note : Eventually, the parallel compacting collector will replace the parallel collector.it

      上述文字中斜體文字告訴咱們,這個收集器和上一個並行收集器惟一的不一樣是在老年代使用了新的算法。

      適用收集場景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)

    • Concurrent Mark-Sweep (CMS) Collector (併發標記清除)

      Young generation collections 一般不會形成長時間停頓,然而old generation collections倒是是形成長時間停頓的,雖然它不長出現,特別是在大的heaps回收被涉及到的時候。爲了處理這個問題,HotSpot JVM 引入了一個叫作 concurrent mark-sweep(CMS) collector,一般也被稱爲低延時收集器low-latency collector.

      適用場景: 僅適用於老年代,新生代處理方式和Parallel Collector相同。

G1目標

G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector. 計劃將G1做爲CMS收集器的長久替代物。

它是爲了平衡 延時和吞吐量之間的一種最優關係。

G1實現原理

基本屬性
和CMS的相同點
  • CMS Replacement(CMS替代物)
  • Server 'Style' Garbage Collector(服務端垃圾收集器-內存,核數區別)
  • Parallel 並行
  • Concurrent 併發
  • Generational 分代
和CMS的主要區別
  • Good Throughput 良好的吞吐量
  • Compacting 壓縮
  • Improved ease-of-use 提高了易用性(更多的JVM參數可用)
  • Predictable(though not hard real-time) 可預估的,非絕對實時。
基本概念
  • G1 堆佈局

G1將堆分紅若干固定大小的Region/區域(區域大小隻有一、二、四、八、16和32M),G1的新生代和老年代都是一個無需連續的區域集合,每個區域獨立進行內存的分配和回收,區域是內存管理的基本單元,在某一個時間節點,多是空閒的,當內存被請求時,內存管理器將空閒的Region分配到某個分代,而後歸還應用分配給的空間。

大多數狀況下,GC的操做同一時間只會在一個區域進行。

  • Region 分佈

    超大對象(Humongous Objects)

    下圖中跨區域的灰色模塊即表明了超大對象,超大對象是指那些空間大小 >=1/2 個區域空間的對象.超大對象有時候會被如下特殊方式處理:

    • 每一個超大對象在老年代區域中的連續區域分配。對象分配起始於在連續區域中的首個成員,若是連續區域中的最後一個區域存在剩餘空間的話,那麼該空間將失去分配的機會,直到其關聯的超大對象被徹底回收
    • 超大對象的回收一般僅在Cleanup停頓中的Marking結束後、或者在Full GC時。
    • 超大對象的分配可能形成垃圾收集停頓過早地發生(主要是由於空間浪費。)
    • 超大對象毫不會發生移動,即便在沒有Full GC的狀況下

UTOOLS1564983870502.png

  • 回收週期

    • Young-only

      Young-only 階段的垃圾 收集 時逐漸地將老年代的對象填充到當前可用的內存。即將能夠提高的新生代對象提高到老年代。

      該階段開始於Young-only的 收集 動做,也就是下圖中的藍色小球,每個小球都是一次收集動做,也就是提高對象到老年代。Young-only 與Space-reclamation 過渡其實是開始於老年代空間 *佔用* 達到某個閾值,即Heap初始化佔用閾值。此時,G1將調度Initial Mark的Young-only收集(藍色大球),而很是規的Young-only(藍色小球)收集。

      • Initial Mark

      此類收集開始於標記過程,附帶一個常規的Young-only收集,併發標記決定全部在老年代區域中可達的存活對象是否要遺留到Space-reclamation 階段。當標記過程未結束時,常規的Young-only 收集可能已經發生,等到標記完成時,將伴隨着兩個特殊的Stop-The-World停頓,RemarkCleanUp.

      • Remark 停頓

        由於在Initial Mark標記過程當中,由於它是併發執行,有可能會發生Young-only收集,形成標記數據有偏差,所以須要從新標記一次,該過程爲串行執行,會形成Stop-The-World.

        在Remark 和Cleanup之間,G1將併發地計算出一份對象存活性總結報告,它將在Cleanup停頓階段更新內部的數據結構

      • Cleanup 停頓

        該停頓一樣將完整的回收空閒區域,而且決定Space-reclamation階段是否須要繼續跟蹤,若是繼續跟隨的話,Young-only階段的完成僅僅作Young-only收集動做。

    • Space-reclamation

      Space-reclamation(空間回收/複用)階段是回收老年代空間,同時處理新生代。

      這個階段由多個混合的收集動做組成,不只包含新生代區域,同時也會排除老年代區域的存活對象,當G1發覺依然沒法知足空閒的空間請求時,G1會終止本階段。若是應用消耗完內存,G1將執行Stop-The-World的全堆壓縮(Full GC)。

    以下圖所示:

    <img src ="https://i.loli.net/2019/08/05/ZMTmN25FohfBkJw.png" width="400" >

    2種過程是循環往復收集。

G1指令細節

初始空間佔用

Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集觸發的閾值,爲老年代空間定義Heap佔用的百分比。

JVM 設置參數:-XX:InitiatingHeapOccupancyPercent

默認狀況下,根據標記時間以及老年代在標記週期中的內存分配,G1垃圾收集器將自動抉擇理想的IHOP的值。

JVM 失效參數:-XX:-G1UseAdaptiveIHOP

修改區域空間大小

-XX:G1HeapRegionSize

UTOOLS1565004969320.png

G1 Vs. 傳統垃圾回收器

  • G1 不區分新/老生代,只區分Region

  • G1 收集分2個階段Young-onlySpace-reclamation

相關文章
相關標籤/搜索