描述ZGC垃圾收集的工作过程。
ZGC的垃圾回收主要分为以下五个阶段:
1)初始标记
从 GC Roots 出发,找出并标记 GC Roots 直接引用的对象存放到活跃对象集合中。这个过程暂会停所有其他线程(STW),暂停时间和 GC Rots 的数量成正比,停顿时间不会随着堆的大小或者活跃对象的大小而增加
2)并发标记
并发扫描 Java 堆中的存活对象,将它们进行标记。
此阶段,应用程序可以并发地执行,不会被垃圾回收过程所影响。
3) 再标记
这个阶段主要是处理并发标记中漏标的对象,还会对非强引用(软引用,弱引用、虚引用)进行并行标记。这个阶段需要 STW,但是需要标记的对象少,耗时很短。
4)始转移
初始转移阶段,先扫描 GC Roots 直接引用的活跃对象,然后再将它们复制到新的内存,之前的内存空间可以回收了这个过程需要 STW,暂时时间跟 GC Roots 数量成正比。
5)在对象转移过程中,对象的地址就会发生变化,这个阶段就是修正旧对象的所有引用。