記憶集和卡表


  這里說的記憶集是一般意義上的,而不是G1那種

  其中, 第三種卡精度所指的是用一種稱為卡表Card Table) 的方式去實現記憶集[1], 這也是
目前最常用的一種記憶集實現形式, 一些資料中甚至直接把它和記憶集混為一談。 前面定義中提到記
憶集其實是一種抽象的數據結構, 抽象的意思是只定義了記憶集的行為意圖, 並沒有定義其行為的
具體實現。 卡表就是記憶集的一種具體實現, 它定義了記憶集的記錄精度、 與堆內存的映射關系等。
關於卡表與記憶集的關系, 讀者不妨按照Java語言中HashMapMap的關系來類比理解。
  

RSet記錄了其他Region中的對象引用本Region中對象的關系,屬於points-into結構(誰引用了我的對象)。

而Card Table則是一種points-out(我引用了誰的對象)的結構,每個Card 覆蓋一定范圍的Heap(一般為512Bytes)。

G1的RSet是在Card Table的基礎上實現的:每個Region會記錄下別的Region有指向自己的指針,並標記這些指針分別在哪些Card的范圍內。

這個RSet其實是一個Hash Table,Key是別的Region的起始地址,Value是一個集合,里面的元素是Card Table的Index。每個Region都有一個對應的Rset。

我畫了一個圖

   

  RSET可以理解為一個HashMap,key是跨帶引用的其他Region的地址,value是一個卡表,卡表可以理解是一個數組,

數組的每一項代碼着RegionA的內存中的一塊有沒有指定年輕代的引用,如果有那么可以理解成這個卡項是1。

  1 為啥用卡表呢?

    因為如果用對象,粒度就太小了,掃描的時候會消耗更多的時間

  2 如何維護RSET呢

    后置寫屏障,寫屏障是每個線程都有一個隊列,專門記錄變更后的引用關系,該隊列滿了之后會交給全局的處理隊列,

    JVM默認1秒鍾處理這個全局隊列一次,以此來維護引用關系的變更。而且在一個混合GC過程中的,remark階段,會把每個線程的寫屏障隊列和全局隊列完全清空,全部處理干凈

    這樣,就能保證在最后的清理階段判斷垃圾是足夠准確的。

  引用自深入理解JVM


免責聲明!

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



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