G1垃圾收集器角色划分與重要概念詳解【純理論】


繼續接着上一次【https://www.cnblogs.com/webor2006/p/11129326.html】對G1進行理論化的學習,上一次學到了G1收集器的堆結構,回憶下:

接着繼續對它進行了解:

G1收集器堆結構:

  • G1使用了gc停頓可預測的模型,來滿足用戶設定的gc停頓時間,根據用戶設定的目標時間,G1會自動地選擇哪些region要清除,一次清除多少個region。
  • G1從多個region中復制存活的對象,然后集中放入一個region中,同時整理、清除內存(copying收集算法)。

G1 vs CMS:

  • 對比使用mark-sweep的CMS,G1使用的copying算法不會造成內存碎片;
  • 對比Parallel Scavenge(基於copying)、Parallel Old收集器(基於mark-compact-sweep),Parallel會對整個區域做整理導致gc停頓會比較長,而G1只是特定地整理幾個region。
  • G1並非一個實時的收集器,與parallel Scavenge一樣,對gc停頓時間的設置並不絕對生效,只是G1有較高的幾率保證不超過設定的gc停頓時間。與之前的gc收集器對比,G1會根據用戶設定的gc停頓時間,智能評估哪幾個region需要被回收可以滿足用戶的設定。

G1重要概念:

  • 分區(Region):G1采取了不同的策略來解決並行、串行和CMS收集器的碎片、暫停時間不可控等問題-----G1將整個堆分成相同大小的分區(Region),再來回顧一下圖:
  • 每個分區都可能是年輕代也可能是老年代,但是在同一時刻只能屬於某個代。年輕代、幸存區、老年代這些概念還存在,成為邏輯上的概念,這樣方便復用之前分代框架的邏輯。 

  • 在物理上不需要連續,則帶來了額外的好處-------有的分區內垃圾對象特別多,有的分區內垃圾對象很少,G1會優先回收垃圾對象特別多的分區,這樣可以花費較少的時間來回收這些分區的垃圾,這也就是G1名字的由來,既首先收集垃圾最多的分區
  • 依然是在新生代滿了的時候,對整個新生代進行回收------整個新生代中的對象,要么被回收、要么晉升,至於新生代也采取分區機制的原因,則是因為這樣跟老年代的策略統一,方便調整代的大小
  • G1還是一種帶壓縮的收集器,在回收老年代的分區時,是將存活的對象從一個分區拷貝到另一個可用分區,這個拷貝的過程就實現了局部的壓縮。
  • 收集集合(CSet):一組可被回收的分區的集合。在CSet中存活的數據會在GC過程中被移動到另一個可用分區,CSet中的分區可以來自eden空間、survivor空間、或者老年代。比如說這倆個區域要被回收則就可以稱之為CSet:

     

  • 已記憶集合(RSet):RSet記錄了其它Region中的對象引用本Region中對象的關系,屬於points-into結構(誰引用了我的對象)。RSet的價值在於使得垃圾收集器不需要掃描整個堆找到誰引用了當前分區中的對象,只需要掃描RSet既可。
    這概念有點繞,因為region與region之間的對象是可以相互引用的,拿圖來說:

    這就出現了RSet,專門用來記錄誰引用了我。

  • 下面來看圖說明:Region1和Region3中的對象都引用了Region2中的對象,因此在Region2的RSet中記錄了這兩個引用。

    可以看到,對於每一個Region都會有一個RSet。

  • G1 GC是在points-out【言外之意就是指向別人的關系】的card table之上再加了一層結構來構成points-into RSet:每個region會記錄下到底哪些別的region有指向自己的指針,而這些指針分別在哪些card的范圍內。
  • 這個Rset其實是一個hash table,key是別的region的起始地址,value是一個集合,里面的元素是card table的index。舉例來說,如果region A的RSet里有一項的key是region B,value里有index為1234的card,它的意思就是region B的一個card里有引用指向region A。所以對region A來說,該RSet記錄的是points-into的關系;而card table仍然記錄了points-out的關系。
  • Snapshot-The-Beginning(SATB):SATB是G1 GC在並發標記階段使用的增量式的標記算法。
  • 並發標記是並發多線程的,但並發線程在同一時刻只掃描一個分區。


免責聲明!

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



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