Skip to content

Latest commit

 

History

History
27 lines (19 loc) · 1.47 KB

card-table.md

File metadata and controls

27 lines (19 loc) · 1.47 KB

CardTable

卡表是单字节数组,数组中每个元素对应一张卡片。卡片的大小通常为 512 字节。

Minor GC 防止全堆扫描

年轻代垃圾回收时,需要考虑老年代中的对象引用了年轻代对象到情况。也就是说,在标记年轻代存活对象的时候,我们需要找出这些老年代的对象,并将其加入到 GC Roots 中。

有了卡表(CardTable) 我们不需要扫描整个老年代区域的对象引用关系,而只需要扫描卡表即可。
JVM(HotSpot)将整个堆划分成一个个大小为 512 字节到卡片,并且维护了一张卡表,卡表中有 1 个标记位用来标记该卡片是否有可能存在指向新生代对象到引用。
如果一个卡片存在对新生代对象到引用,我们就说这是一张脏卡。

在进行 Minor GC 到时候,我们只需要在卡表中搜索脏卡,并将脏卡中到对象加入到 GC Roots 即可。
这样极大到节省了 Minor GC 执行时间。

维护 CardTable

标记卡片为脏卡:
A.当发生老年代对象引用新生代对象的时候,将卡表的标记位标记为脏卡。
B.Minor GC 过程中会涉及到对象的移动,这势必会更新相关对象的引用关系,此时如果存在老年代引用新生代的情况,会标记相关卡片为脏卡。

清除卡表脏卡标记:
Minor GC 扫描完所有的脏卡,并将涉及到的老年代对象加入到 GC Roots 之后,便会清除所有的脏卡标记位。