G1垃圾收集器深度理論講解【純理論】


在上三次中對於G1官方解讀之后,接下來還得回到G1的理論化知識的了解階段。。確實G1是概念比較復雜,而且它也是未來JDK的垃圾回收的主流,所以花再多的時間在這上面也是值得的,先來回顧一下上次過過的理論在哪打止了:https://www.cnblogs.com/webor2006/p/11129572.html

下面繼續:

G1相對於CMS的的優勢:

  • G1在壓縮空間方面有優勢。
    對於CMS是采用標記清除算法,不帶壓縮功能的,所以肯定會有內存碎片的產生,而G1采用的是拷貝復制算法,所以肯定不會產生內存碎片問題,所以壓縮起來空間利用率也大大提升了。
  • G1通過將內存空間分成區域(Region)的方式避免內存碎片問題。
  • Eden、Survivor、Old區不再固定,在內存使用率上來說更靈活。
    因為G1的Eden、Survivor、Old的個數是可以動態伸縮的,而不像CMS,這些區域就已經定好大小了不能被調整。
  • G1可以通過設置預期停頓時間(Pause Time)來控制垃圾收集時間,避免應用雪崩現象。
  • G1在回收內存后會馬上同時做合並空閑內存的工作,而CMS默認是在STW(stop the world)的時候做。
  • G1會在Young GC中使用,而CMS只能在Old區使用。

G1的適合場景:

  • 服務端多核CPU、JVM內存占用較大的應用。
  • 應用在運行過程中會產生大量內存碎片、需要經常壓縮空間。
  • 想要更可控、可預期的GC停頓周期;防止高並發下應用的雪崩現象。

G1 GC模式:

  • G1提供了兩種GC模式,Young GC和Mixed GC,兩種都是完全Stop The World的。
  • Young GC:選定所有年輕代里的Region。通過控制年輕代的Region個數,既年輕代內存大小,來控制Young GC的時間開銷。
  • Mixed GC:選定所有年輕代里的Region,外加根據global concurrent marking【在之后有單獨介紹】統計得出收集收益高的若干老年代Region。在用戶指定的開銷目標范圍內盡可能選擇收益高的老年代Region。
  •  Mixed GC不是Full GC,它只能回收部分老年代的Region,如果Mixed GC實在無法跟上程序分配內存的速度,導致老年代填滿無法繼續進行Mixed GC,就會使用serial old GC(Full GC)來收集整個GC heap。所以本質上,G1是不提供Full GC的

global concurrent marking:

  • global concurrent marking的執行過程類似於CMS,但是不同的是,在G1 GC中,它主要是為Mixed GC提供標記服務的,並不是一次GC過程的一個必須環節。
  • global concurrent marking的執行過程分為四個步驟。
  • 初始標記(inital mark,STW):它標記了從GC Root開始直接可達的對象。
  • 並發標記(Concurrent Marking):這個階段從GC Root開始對heap中的對象進行標記,標記線程與應用程序線程並發執行,並且收集各個Region的存活對象信息。
  • 重新標記(Remark,STW):標記那些在並發標記階段發生變化的對象,將被回收。
  • 清理(Cleanup):清除空Region(沒有存活對象的),加入到free list。
  • 第一階段inital mark是共用了Young GC的暫停,這是因為他們可以復用root scan操作,所以可以說global concurrent marking是伴隨Young GC而發生的。
  • 第四階段Cleanup只是回收了沒有存活對象的Region,所以它並不需要STW。

G1在運行過程中的主要模式:

  • YGC(不同於CMS)
  • 並發階段
  • 混合模式
  • Full GC(一般是G1出現問題時發生)
  • G1 YGC在Eden充滿時觸發,在回收之后所有之前屬於Eden的區域全部變成空白,既不屬於任何一個分區(Eden、Survivor、Old)。

Mixed GC:

  • 什么時候發生Mixed GC?
  • 由一些參數控制,另外也控制着哪些老年代Region會被選入CSet(收集集合)。
  • G1HeapWastePercent:在global concurrent marking結束之后,我們可以知道old gen regions中有多少空間要被回收,在每次YGC之后和再次發生Mixed GC之前,會檢查垃圾占比是否達到此參數,只有達到了,下次才會發生Mixed GC。
  • G1MixedGCLiveThresholdPercent:old generation region中的存活對象的占比,只有在此參數之下,才會被選入CSet。
  • G1MixedGCCountTarget:一次global concurrent marking之后,最多執行Mixed GC的次數。
  • G1OldCSetRegionThresholdPercent:一次Mixed GC中能被選入CSet的最多old generation region數量。

G1 GC其他參數:


免責聲明!

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



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