(二)ZygoteSpace

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,反而占用内存了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容