ZygoteSpace虽然间接继承了AllocSpace,Alloc和Free都是空实现。所以我觉得ZygoteSpace应该继承MemMapSpace。
art/runtime/gc/space/zygote_space.h:30
class ZygoteSpace final : public ContinuousMemMapAllocSpace {
public:
// Returns the remaining storage in the out_map field.
static ZygoteSpace* Create(const std::string& name,
MemMap&& mem_map,
accounting::ContinuousSpaceBitmap&& live_bitmap,
accounting::ContinuousSpaceBitmap&& mark_bitmap)
REQUIRES_SHARED(Locks::mutator_lock_);
SpaceType GetType() const override {
return kSpaceTypeZygoteSpace;
}
uint64_t GetBytesAllocated() override {
return Size();
}
uint64_t GetObjectsAllocated() override {
return objects_allocated_.load();
}
bool CanMoveObjects() const override {
return false;
}
protected:
accounting::ContinuousSpaceBitmap::SweepCallback* GetSweepCallback() override {
return &SweepCallback;
}
private:
ZygoteSpace(const std::string& name, MemMap&& mem_map, size_t objects_allocated);
};
art/runtime/gc/space/zygote_space.cc:45
ZygoteSpace* ZygoteSpace::Create(const std::string& name,
MemMap&& mem_map,
accounting::ContinuousSpaceBitmap&& live_bitmap,
accounting::ContinuousSpaceBitmap&& mark_bitmap) {
DCHECK(live_bitmap.IsValid());
DCHECK(mark_bitmap.IsValid());
size_t objects_allocated = 0;
CountObjectsAllocated visitor(&objects_allocated);
ReaderMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_);
live_bitmap.VisitMarkedRange(reinterpret_cast<uintptr_t>(mem_map.Begin()),
reinterpret_cast<uintptr_t>(mem_map.End()), visitor);
ZygoteSpace* zygote_space = new ZygoteSpace(name, std::move(mem_map), objects_allocated);
zygote_space->live_bitmap_ = std::move(live_bitmap);
zygote_space->mark_bitmap_ = std::move(mark_bitmap);
return zygote_space;
}
ZygoteSpace用于保存Zygote进程的资源,不会被垃圾回收。当然子进程是fork出来的,除非重写了该区域,不然也回收不了该区域,重新写入数据只会导致copy on write,反而占用内存了。