jvm的card table數據結構

jvm系列算法

做用

爲了支持高頻率的新生代的回收,虛擬機使用一種叫作卡表(Card Table)的數據結構,卡表做爲一個比特位的集合,每個比特位能夠用來表示年老代的某一區域中的全部對象是否持有新生代對象的引用。

clipboard.png

這樣新生代在GC時,能夠不用花大量的時間掃描全部年老代對象,來肯定每個對象的引用關係,而能夠先掃描卡表,只有卡表的標記位爲1時,才須要掃描給定區域的年老代對象。而卡表位爲0的所在區域的年老代對象,必定不包含有對新生代的引用。

clipboard.png

卡表中每個位表示年老代4K的空間,卡表記錄未0的年老代區域沒有任何對象指向新生代,只有卡表位爲1的區域纔有對象包含新生代引用,所以在新生代GC時,只須要掃描卡表位爲1所在的年老代空間。使用這種方式,能夠大大加快新生代的回收速度。

clipboard.png

結構

卡表是個單字節數組,每一個數組元素對應堆中的一張卡。

clipboard.png

每次年老代對象中某個引用新生代的字段發生變化時,Hotspot VM就必須將該卡所對應的卡表元素設置爲適當的值,從而將該引用字段所在的卡標記爲髒。在Minor GC過程當中,垃圾收集器只會在髒卡中掃描查找年老代-新生代引用。

clipboard.png

Hotspot VM的字節碼解釋器和JIT編譯器使用寫屏障維護卡表。寫屏障是一小段將卡狀態設置爲髒的代碼。解釋器每次執行更新引用的字節碼時,都會執行一段寫屏障,JIT編譯器在生成更新引用的代碼後,也會生成一段寫屏障。雖然寫屏障使得應用線程增長了一些性能開銷,但Minor GC變快了許多,總體的垃圾收集效率也提升了許多,一般應用的吞吐量也會有所改善。

相關文章
相關標籤/搜索