<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大佬帶你深入解析java虛擬機:垃圾優(yōu)先的垃圾回收器(G1 GC)

          共 2632字,需瀏覽 6分鐘

           ·

          2022-03-10 08:36

          G1 GC

          G1 GC是面向服務(wù)端應(yīng)用程序的垃圾回收器,通過新的堆設(shè)計和停頓預測模型,可以到達用戶指定的一個比較合理的軟實時目標。本章將詳細分析G1 GC的設(shè)計和實現(xiàn)。

          G1 GC簡介

          基于Region的堆

          G1 GC全稱是Garbage-First Garbage Collector,即垃圾優(yōu)先的垃圾回收器,可以使用-XX:+UseG1GC開啟。G1 GC(以下簡稱G1)拋棄了既有堆模型,它將整個堆劃分為一些大小固定的內(nèi)存塊(Region),通過-XX:G1HeapRegionSize=控制Region大小(注意每個Region的大小只能是1MB、2MB、4MB、8MB、16MB和32MB),如圖11-1所示。

          圖11-1 基于Region的堆劃分

          G1沒有拋棄弱分代假說,在圖11-1中,每個Region仍然包含代紀類型,一個特別的類型是巨型Region(Humongous Region),如果用戶分配的對象超過了單個Region的大小,那么將使用連續(xù)多個Region存放對象,并將這些Region都標記為巨型Region。除了圖11-1中包含的五種Region類型外,G1還有一個Archive類型的Region,它包含的是不可變的數(shù)據(jù),該類型用于支持AppCDS。有了基于Region的堆劃分就會相應(yīng)需要基于Region的垃圾回收策略,G1包含YGC、FGC和Mixed GC,不同的垃圾回收策略將清理不同類型的Region。

          記憶集RSet

          G1包含YGC、FGC和Mixed GC三種垃圾回收策略,其中,YGC和FGC與其他垃圾回收器類似:YGC只回收新生代Region,而FGC回收整個堆。獨有的Mixed GC是一種Partial GC策略,它會回收所有新生代Region和部分老年代Region。

          既然Mixed GC屬于Partial GC,那么它也會面臨跨代引用問題,因為它回收整個新生代和部分老年代Region,所以一個老年代Region的根集包括GC Root和從老年代Region指向老年代Region的引用(old->old),新生代Region根集包括GC Root和老年代Region指向新生代Region的引用(old->young)。

          G1使用RSet記憶集記錄這些跨代引用。在記憶集設(shè)計中一般包含兩種方式:一種是points-into記憶集,它表示“哪些對象引用了我”;另一種是points-out記憶集,它記錄的是“我引用了哪些對象”。G1同時使用兩種方式,如圖11-2所示。

          圖11-2 G1 RSet

          假設(shè)有a.field = b,如果使用points-into記憶集,那么b擁有記憶集,它記錄a的位置。如果使用points-out記憶集,那么a擁有記憶集,它記錄b的位置。G1的記憶集RSet同時使用兩種設(shè)計,首先使用points-into結(jié)構(gòu)來記憶有哪些其他Region引用自身(即對象b所在Region記錄引用自身的對象a所在Region),然后每個Region包含一個points-out的卡表結(jié)構(gòu),記錄指向當前對象的對象的具體位置(即對象b所在Region的卡表的索引)。

          在G1堆中,每個Region會關(guān)聯(lián)一個RSet,后置寫屏障(g1_write_barrier_post)捕獲Mutator線程向?qū)ο髮懭氲拿總€值。如果發(fā)現(xiàn)寫入操作導致兩個對象產(chǎn)生old->old或者old->young關(guān)系,那么可以更新RSet,并將對象寫入線程局部的DirtyCardQueue(DCQ),當線程局部的DCQ已滿后,再將DCQ放入全局的DirtyCardQueueSet(DCQS)。

          出于性能考慮,寫屏障內(nèi)的代碼應(yīng)該盡可能簡單和高效,g1_write_barrier_post只負責發(fā)現(xiàn)那些產(chǎn)生old->old或者old->young關(guān)系的修改,并將對象加入DCQ。后續(xù)處理DCQ中的對象及更新RSet的操作則由專門的Refine線程負責。Refine線程取出DCQS中的DCQ的對象,找到被該對象引用的對象,然后更新被引用對象所在的Region的RSet,如代碼清單11-1所示:

          代碼清單11-1?更新RSet

          void G1ConcurrentRefineOopClosure::do_oop_work(T* p) {
          T o = RawAccess::oop_load(p);
          if (CompressedOops::is_null(o)){ return; }
          oop obj = CompressedOops::decode_not_null(o);
          if (HeapRegion::is_in_same_region(p, obj)) {
          return; // 如果對象和被引用對象在同一個Region中,則不需要處理
          }
          // 如果在不同Region中,則需找到被引用者所在Region的RSet
          HeapRegionRemSet* to_rem_set = _g1h->heap_region_containing(obj)->rem_set();
          // 在被引用者的RSet中添加關(guān)系
          if (to_rem_set->is_tracked()) {
          to_rem_set->add_reference(p, _worker_i);
          }
          }

          停頓預測模型

          前面提到Mixed GC回收整個新生代和部分老年代Region,對于部分老年代Region的選擇也有些講究。G1會根據(jù)歷史數(shù)據(jù)進行數(shù)學運算,計算出本次回收需要選擇的老年代Region數(shù)量,以此來達到用戶設(shè)置的-XX:MaxGCPauseMillis時間,即滿足用戶期望的GC不能超過最長停頓時間。注意,如果這個時間設(shè)置得不合理,G1也達不到期望。

          本文給大家講解的內(nèi)容是深入解析java虛擬機:垃圾優(yōu)先的垃圾回收器

          1. 下篇文章給大家講解的是深入解析java虛擬機:新生代垃圾回收

          2. 覺得文章不錯的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;

          3. 感謝大家的支持!


          本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學習更多的話可以到微信公眾號里找我,我等你哦。

          瀏覽 66
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狼人综合在线 | 久久久久无码精品国产91福利 | 天天天日夜夜夜操 | 欧美性爱在线播放 | 国产在线观看国产精品产拍 |