三分鐘簡單瞭解垃圾收集器之G1垃圾收集器

本文旨在 快速瞭解 G1垃圾收集器是什麼,有什麼特色原理是什麼,經常使用的配置參數有哪些,與CMS垃圾收集器相比有什麼優點算法

廢話不bb,正文開始!併發


1、G1 是什麼

  • G1 是一種面向服務端的垃圾收集器,應用在多核處理器和大容量內存環境中,在實現高吞吐量的同時,儘量的知足垃圾收集器的暫停時間要求。性能

  • 像 CMS 收集器同樣,能與應用程序線程併發執行。spa

    整理空閒空間更快,
      須要更多的時間來預測 GC 停頓時間,
      不但願犧牲大量的吞吐性能,不須要更大的 JAVA Heap。
    複製代碼
  • G1 收集器的設計目的是取代 CMS 收集器。線程

    G1 垃圾收集器是一個有整理內存過程的垃圾收集器,不會產生不少內存碎片。
      G1 的 Stop The World 更可控,G1 在停頓上添加了預測機制,用戶能夠指按期望的停頓時間。
    複製代碼
  • G1 是在 2012 年纔在 jdk.1.7u4 中能夠呀用,在 jdk9 中將 G1 變成默認垃圾收集器來代替 CMS。它是一款面向服務應用的收集器。設計

    主要改變是 Eden、Survivor 和 Tenured 等內存區域再也不是連續的,而是變成了一個個大小同樣的 region
       每一個 region 從 1M 到 32M 不等,一個 region 有可能屬於 Eden、Survivor 或者 Tenured 內存區域。
    複製代碼

2、特色

  • G1 能充分利用多 CPU、多核環境硬件優點,儘可能縮短 STW。
  • G1 總體採用標記-整理算法,局部是經過是經過複製算法,不會產生內存碎片。
  • 宏觀上看 G1 之中再也不區分年輕代和老年代,被內存劃分爲多個獨立的子區域。
  • G1 收集器裏面講整個的內存區域混合在一塊兒,但其自己依然在小範圍內要進行年輕代和老年代的區分。保留了新生代和老年代,但她們不在是物理隔離,而是一部分 Region 的集合且不須要 Region 是連續的,也就是說依然會採用不一樣的 GC 方式來處理不一樣的區域。
  • G1 雖然也是分代收集器,但整個內存分區不存在物理上的年輕代和老年代的區別,也不須要徹底獨立的 Survivor to space 堆作複製準備。G1 只有邏輯上的分代概念,或者說每一個分區均可能隨 G1 的運行在不一樣代之間先後切換。

3、底層原理

一、Region 區域化垃圾收集器:最大好處是化整爲零,避免全內存掃描,只須要按照區域來進行掃描便可。code

二、回收步驟,四步過程:cdn

初始標記:標記一下GC Roots能直接關聯到的對象,須要停頓線程,但耗時很短
 併發標記:是從GC Root開始對堆中對象進行可達性分析,找出存活的對象,這階段耗時較長,但可與用戶程序併發執行
 最終標記:修正在併發標記期間因用戶程序繼續運做而致使標記產生變更的那一部分標記記錄
 篩選回收:對各個Region的回收價值和成本進行排序,根據用戶所指望的GC停頓時間來制定回收計劃
複製代碼

4、經常使用配置參數:

-XX:UseG1GC對象

-XX:G1HeapRegionSize=n:設置G1區域的大小,值是2的冪blog

-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間

5、與CMS相比的優點

沒有內存碎片 能夠精確控制停頓

相關文章
相關標籤/搜索