发布于2026-07-10 阅读(0)
扫一扫,手机访问
ZGC的标记阶段,是整个回收循环中实现低停顿的关键起点。它并不追求一次性扫完所有对象,而是通过分步、并发、带屏障保障的方式,把原本必须串行完成的“识别存活对象”这个任务,拆解成多个可并行、可中断、且与应用线程协同工作的子过程。下面,我们不妨拆开来看,ZGC到底是怎么做到这一点的。

这是唯一需要全局暂停的标记步骤,但ZGC只做最轻量的工作——从GC Roots(比如栈帧中的局部变量、静态字段、JNI引用等)出发,标记直接可达的对象,然后把它们压入标记栈。关键点在于,它只处理“一步可达”的对象,不递归遍历引用链。所以,这轮STW的耗时通常只有0.1ms级别,对响应时间几乎无感。
初始标记一结束,GC线程就立刻启动并发标记——以初始标记压入栈的对象为起点,采用深度优先或工作窃取方式遍历整个对象图。这个阶段,应用线程还在持续运行,对象引用关系随时可能变化,漏标风险随之而来。ZGC通过以下机制来应对:
这套组合拳,让并发标记既高效又可靠。
并发标记结束后,进入再标记阶段,主要做两件事:
这个阶段不重新遍历整个堆,只处理增量日志和根集快照,STW时间通常低于0.2ms。可以说,ZGC把暂停时间压到了极致。
ZGC将软引用、弱引用、虚引用以及finalize队列等“非强可达”对象的处理也纳入标记流程,但不会放在STW中执行。它在并发标记后期启动专用线程,异步扫描这些结构,并配合读/写屏障保证语义正确性。举个例子,对重写了finalize()的对象,ZGC会额外打标并延迟转移,直到其finalize方法执行完毕。这种设计,既保证了语义的完整性,又避免了不必要的停顿。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8