1. 简介
GC回收周期大体如下图所示:
GC回收周期包括如下11个子阶段:
- phase 1:初始标记,需要STW
- phase 2:并发标记
- phase 3:标记结束,需要STW
- phase 4:并发处理软引用、弱引用
- phase 5:并发重置Relocation Set
- phase 6:并发销毁可回收页
- phase 7:内存验证
- phase 8:并发选择Relocation Set
- phase 9:并发准备Relocation Set
- phase 10:开始Relocate,STW
- phase 11:并发Relocate
出于回收效率的考虑,remap过程放在下一个回收周期的并发标记子阶段进行。
2. 代码分析
2.1 入口
ZGC的入口在ZCollectedHeap collect方法
- 调用ZDriver的collect方法
zCollectedHeap.cpp
void ZCollectedHeap::collect(GCCause::Cause cause) {
_driver->collect(cause);
}
根据传入的GCCause,判断使用同步消息还是异步消息。
- ZGC自身的触发策略都使用异步消息,包括rule_timer、rule_warmup、rule_allocation_rate、rule_proactive
- metaspace GC使用异步消息
- 其他情况使用同步消息
zDriver.cpp
void ZDriver::collect(GCCause::Cause cause) {
switch (cause) {
case GCCause::_wb_young_gc:
case GCCause::_wb_conc_mark:
case GCCaus