着色
zgc只支持64位系统,然后最大支持4T的堆内存,64位指针只需要使用42位就可以寻址4TB的空间,这意味着有多余的22位可以利用。zgc利用了4位,分别用来表示:是否已经finalize,重映射(remap),mark0,mark1。
mark0与mark1表示是否被标记,在gc周期性更换,这样可以不要重复去复原(就像以前survivor的复制回收算法,也就是这次用mark0表示,下次就用mark1,在用mark1标记时顺便把mark0复原,在用mark0标记时顺便把mark1复原)。
读屏障
zgc引入读屏障,也就是通过gc root对象读取其他堆对象时,触发读屏障,做一些事情,再读取。
分页
zgc将堆分为 2M(small), 32M(medium), n*2M(large)三种大小的页面(Page)来管理,根据对象的大小来判断在那种页面分配
gc过程
标记阶段
标记阶段将对象指针的remap位标记为未完成重定向并加入存活队列。
1.stop the world,标记所有gc root对象,将每个页上存活的gc root对象,保存在该页对应的存活表(bitmap来实现)。
2.恢复应用程序,进入并发递归标记所有对象阶段,这个阶段中,因为有读