染色指针是一种直接将少量额外的信息存储在指针上的技术,可是为什么指针本身也可以存储 额外信息呢?在64位系统中,理论可以访问的内存高达16EB(2的64次幂)字节 [3] 。实际 上,基于需求(用不到那么多内存)、性能(地址越宽在做地址转换时需要的页表级数越多) 和成本(消耗更多晶体管)的考虑,在AMD64架构 [4] 中只支持到52位(4PB)的地址总线 和48位(256TB)的虚拟地址空间,所以目前64位的硬件实际能够支持的最大内存只有 256TB。此外,操作系统一侧也还会施加自己的约束,64位的Linux则分别支持47位 (128TB)的进程虚拟地址空间和46位(64TB)的物理地址空间,64位的Windows系统甚 至只支持44位(16TB)的物理地址空间。
尽管Linux下64位指针的高18位不能用来寻址,但剩余的46位指针所能支持的64TB内存在今 天仍然能够充分满足大型服务器的需要。鉴于此,ZGC的染色指针技术继续盯上了这剩下的46 位指针宽度,将其高4位提取出来存储四个标志信息。通过这些标志位,虚拟机可以直接从指 针中看到其引用对象的三色标记状态、是否进入了重分配集(即被移动过)、是否只能通过 finalize()方法才能被访问到。当然,由于这些标志位进一步压缩了原本就只有46位的地址空 间,也直接导致ZGC能够管理的内存不可以超过4TB(2的42次幂) 。