说一说ZGC的读屏障和颜色指针

颜色指针:
颜色指针可以说是ZGC的核心概念。因为他在指针中借了几个位出来做事情,所以它必须要求在64位的机器上才可以工作。
并且因为要求64位的指针,也就不能支持压缩指针。ZGC中低42位表示使用中的堆空间
ZGC借几位高位来做GC相关的事情(快速实现垃圾回收中的并发标记、转移和重定位等) 。
每个对象有一个64位指针,这64位被分为:
18位:预留给以后使用;
1位:Finalizable标识,此位与并发引用处理有关,它表示这个对象只能通过finalizer才能访问;
1位:Remapped标识,设置此位的值后,对象未指向relocation set中(relocation set表示需要GC的
Region集合);
1位:Marked1标识;
1位:Marked0标识,和上面的Marked1都是标记对象用于辅助GC;
42位:对象的地址(所以它可以支持2^42=4T内存):

读屏障:
ZGC在并发重分配过程中,在复制算法后将原来的region(里的对象)移动到另外一个region,涉及到新的地址需要更新,什么时候更新呢?
这个过程是一个惰性过程,它不是一直在更新,当我去堆里拿一个老的对象值时,拿到的是一个引用,这个引用在做并发标记时颜色指针已经将颜色改过了,在拿老引用过程中把颜色指针那部分也拿过来了,在拿的时候会加一个读屏障判断一下这个指针是否被修改过,如果被修改过了,它内部会将老的引用,挪到已经被更新过的地址里。 通过转发表记录从旧对象到新对象的转向关系。