collector_type.h文件中关于枚举值kCollectorTypeSS有这样一句注释来介绍它:“Semi-space/mark-sweep hybrid,enables compaction."。其含义是SemiSpace综合了Semi-space(即Copying Collector)和Mark-Sweep方法,同时还支持压缩。而kCollectorTypeGSS则是支持分代回收的SS方法。
纵观SemiSpace,它的GC逻辑无非就是如下两点。
semi_space.cc
void SemiSpace::RunPhases() {
Thread* self = Thread::Current();
InitializePhase();//①回收器初始化
//if为true,说明mutator线程已被暂停。这种情况的出现和SemiSpace的用法有关,
//我们暂且不用考虑这些
if (Locks::mutator_lock_->IsExclusiveHeld(self)) {
MarkingPhase();//②标记工作
ReclaimPhase();//回收工作,非常简单,留给读者自行研究
} else {
//如果mutator未暂停,则SemiSpace只有标记阶段需要暂停mutator
{
ScopedPause pause(this);//暂停mutator
MarkingPhase();//标记工作
}
{//mutator恢复运行,可同时开展回收工作
ReaderMutexLock mu(self, *Locks::mutator_lock_);
ReclaimPhase();
}
}
FinishPhase();
}