G1 垃圾回收 源码阅读02 RememberSet

时间:2024-04-01 22:44:35

G1 垃圾回收 源码阅读02 RememberSet

创建一个当前collection的top快照,然后筛除掉那些我们不想扫描的card mark

G1 垃圾回收 源码阅读02 RememberSet

增加一个dirty_region

1.判断该入参region已经dirty,就直接return

2.如果不是,就利用底层的cmpxchg指令,来把这个region标记为dirty

3.标记region为dirty成功后,就分配对应的空间大小 allocated,然后把入参region放进去

G1 垃圾回收 源码阅读02 RememberSet

清除卡表中的dirty region

1.判断如果不存在dirty region,就直接return

2.计算出块数量,和活跃worker数量

3.迭代dirty card region列表

4.调用workers来执行清理task

 

G1 垃圾回收 源码阅读02 RememberSet

更新rememberSet

1.先对HCC的日志entries,应用闭包

2.然后对所有剩余的日志entries,应用闭包

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

G1 垃圾回收 源码阅读02 RememberSet

核心方法,并发refine card

1.校验当前是gc 活跃的

2.构造能够代表card的region指针

3.根据找到的指针获取到HeapRegion,获取不到就直接返回

4.判断如果card 从来就不是脏的,直接return返回

G1 垃圾回收 源码阅读02 RememberSet

5.校验这个HeapRegion,必须是old 或者humongous,或者压缩的

G1 垃圾回收 源码阅读02 RememberSet

1.如果当前card没有执行中,就把card指针设置为脏card的值

2.然后把card_ptr 添加到dirtyCardQueue 队列中

3.如果当前card已经是执行中,那么累加refined_cards 数量