G1 垃圾回收 源码阅读02 RememberSet

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

增加一个dirty_region

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

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

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

清除卡表中的dirty region

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

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

3.迭代dirty card region列表

4.调用workers来执行清理task

更新rememberSet

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

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

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

核心方法,并发refine card

1.校验当前是gc 活跃的

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

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

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

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

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

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

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

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

GC过程中进行refine

1.找到包含card的region

2.判断如果card不是dirty,就直接return,什么也不做

3.如果card是脏的,就增加对应的dirty region

4.计算出card_end地址,然后找到内存空间,检查不能为空

5.检查不能扫描young的空间region

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/106735619
今日推荐