染色指针
1、HotSpot的垃圾收集器有几种不同的标记实现方案。
2、把标记直接记录在对象头上(Serial收集器)。
3、把标记记录在于对象相互独立的数据结构上(G1、Shenandoah 使用了一种相当于堆内存的1/64大小的,称为BitMap的结构来记录标记信息)。
4、ZGC染色指针直接把标记信息记截引用对象的指针上。
5、染色指针是一种直接将少量额外的信息存储在指针上的技术。
6、目前Linux下64位指针的高18位不能用来寻址,但剩余的46位指针所能支持的64TB内存仍然不能够充分满足大型服务器的需要。鉴于此,ZGC将其高4位提取出来存储四个标志信息。
7、通过这些标志虚拟机就可以直接从指针中看到器引用对象的三色标记状态(Marked0、Marked1)、是否进入了重分配集(是否被移动过——Remapped)、是否只能通过finalize()方法才能被访问到(Finalizable)。由于这些标志位进一步压缩了原本只有46位的地址空寂,导致ZGC能够管理的内存不可以超过4TB。
染色指针的优势
1、染色指针可以使得一旦某个Region的存活对象被移走之后,这个Region立即就能够被释放和重用掉,而不必等待整个堆中所有指令向该Region的引用都被修正后才能清理。
2、染色指针可以大幅减少在垃圾收集过程中内存屏障的使用数量,设置内存屏障,尤其是在写屏障的目的通常是为了记录对象引用的变动情况,如果将这些信息直接维护在指针中,显然就可以省去一些专门的记录操作。
3、染色指针可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据,以便日后进一步提高性能。
ZGC的运作过程
1、并发标记(Concurrent Mark):与G1、Shenandoah 一样,并发标记是遍历对象图做可达性分析的阶段,前后也要经过类似于G1、Shenandoah的初始标记、终标记的短暂停顿,而且这些停顿阶段所做的事情在目标上也是相类似的。
2、并发预备重分配(Concurrent Prepare for Relocate):这个阶段需要根据特定的查询条件统计得出本次收集过程要清理哪些Region,将这些Region组成重分配集(Relocation Set)。
3、并发重分配(Concurrent Relocate):重分配是ZGC执行过程中的核心阶段,这个过程要把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表(Forward Table),记录从旧对象到新对象的转向关系。
4、并发重映射(Concurrent Remap):重映射所做的就是修正整个堆中指向重分配集中旧对象的所有引用,ZGC 的并发映射并不是以一个必须要“迫切”去完成的任务。ZGC很巧妙地把并发重映射阶段要做的工作,合并到下一次垃圾收集循环中的并发标记阶段里去完成,反正他们都是要遍历所有对象的,这样合并节省了
Was this helpful?
0 / 0