66.G1垃圾收集器、優勢與缺點、參數設置、使用場景


 

1.G1概述

  1. 為什么有了前面幾個強大的垃圾收集器,還需要Garbage First(G1) GC?
    隨着應用程序所應對的業務越來越龐大、復雜,前面幾款垃圾收集器已經不能滿足實際的需要,所以出現了G1

  2. G1是在延遲可控的情況下,獲得盡可能高的吞吐量,所以才擔當起“全功能收集器”的重任與期望。(全功能收集器的意思是它既負責新生代的垃圾回收又負責老年代的垃圾回收)
    在這里插入圖片描述

  3. G1收集器將堆內存划分為很多不想關的區域(Region)(物理上可以是不連續的空間),使用不同的Region來表示EdenS0區,S1區,老年代等等。

  4. G1有計划的避免在整個Java堆中進行全區域的垃圾收集,G1會跟蹤各個Region里面的垃圾堆積的價值大小(回收所獲得的空間大小以及回收所需要的時間經驗值),在后台維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的Region
    在這里插入圖片描述

  5. G1JDK7中正式啟用,但不是默認的垃圾收集器,在JDK9中成為了默認的垃圾收集器,取代了CMS以及Parallel + Parallel Old組合。在JDK7以及JDK8中,可以使用-XX:+UseG1GC來啟用。
    在這里插入圖片描述

  6. G1將堆空間划分為若干個區域(Region),各個region可以是Eden區,Survivor區以及Old區等。
    在這里插入圖片描述

2.G1的優勢與缺點

優勢:

  1. 並行與並發 - 多個垃圾收集線程同時工作(並行),垃圾收集線程與用戶線程交替執行(並發)。
  2. 分代收集 - G1將堆空間划分為若干個區域(Region),這些區域中包含了邏輯上的年輕代和老年代。它不要求年輕代,老年代是連續的。同時,G1同時兼顧年輕代和老年代的垃圾回收,其他的垃圾收集器,要么工作在年輕代,要么工作在老年代。
    在這里插入圖片描述
  3. 空間整合(內存碎片整理) - G1內存回收使用Region作為基本單位,Region之間使用的是復制算法,能夠對內存空間進行整理。
    在這里插入圖片描述
  4. 可預測的停頓時間模型 - 可以讓用戶明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。
    在這里插入圖片描述
    缺點:
    相比於CMSG1還不具備全方位、壓倒性優勢。比如,G1為了垃圾收集產生的內存占用以及程序運行時的額外執行負載都比CMS要高。
    在這里插入圖片描述

3.G1參數設置

-XX:G1HeapRegionSize 設置每個region的大小,值只能是2n次方(1,2,4,8,16,32),范圍是1MB32MB
-XX:MaxGCPauseMillis 設置期望達到(JVM會盡力實現,但不保證)的最大GC停頓時間,默認是200ms。 這個參數如果設置的過小,會導致一次回收的region個數減少,回收的垃圾對象減少(因為設置的垃圾線程工作的時間減少了),如果產生垃圾的速度很快,可能會導致Full GC
-XX:ParallelGCThread 設置STW的時候並行的垃圾線程數量。
-XX:ConcGCThreads 設置用戶線程與垃圾收集線程並發的時候,垃圾收集線程的線程數量
在這里插入圖片描述
通常使用G1收集器,不需要那么多的參數配置。只需要進行下圖所示的3步。其他的參數,G1會自動調節或使用默認的參數。
在這里插入圖片描述

4.G1使用場景

在這里插入圖片描述


免責聲明!

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



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