-----------Create------------------------------------------------- SpaceBitmap* SpaceBitmap::Create( const std::string& name, uint8_t* heap_begin, size_t heap_capacity) { //bitmap_size(标记heap_capacity大小需要的 字节数) const size_t bitmap_size = ComputeBitmapSize(heap_capacity); |____________________ComputeBitmapSize ________________________________________________________________________________________________ //理论上我们1个bit标记一个kAlignment大小字节的内存,而我们不能直接创建对象操作bit,这里利用intptr_t 和 uintptr_t数据类型。 //标记的时候我们一般先找到内存对应bitmap所在的uintptr_t 对象位置,然后在针对uintptr_t对象进行按位操作。 //这里这份size计算如下:capacity 代表标记的heap大小,单位是字节 size_t SpaceBitmap::ComputeBitmapSize(uint64_t capacity) { // kBitsPerIntPtrT代表一个intptr_t 数据类型占用多少位,32位平台是32,64位平台是64,kAlignment kAlignment是bit标记的内存大小, //一般标记object 是8byte,而标记page是4byte。 假设64位平台标记object,一个intptr_t 对象可以标记8*64=512字节 const uint64_t kBytesCoveredPerWord = kAlignment * kBitsPerIntPtrT; //这个主要是对capacity 补位到kBytesCoveredPerWord 的整数倍,然后再属于intptr_t大小得到需要的bitmap大小。 return (RoundUp(capacity, kBytesCoveredPerWord) / kBytesCoveredPerWord) * sizeof(intptr_t); } |_______________________________________________________________________________________________________________________________________________ //通过MapAnonymous创建一块内存给SpaceBitmap进行标记 MemMap mem_map = MemMap::MapAnonymous(name.c_str(),bitmap_size,PROT_READ | PROT_WRITE, /*low_4gb=*/ false ,&error_msg); return CreateFromMemMap(name, std::move(mem_map), heap_begin, heap_capacity); } template SpaceBitmap* SpaceBitmap::CreateFromMemMap( const std::string& name, MemMap&& mem_map, uint8_t* heap_begin, size_t heap_capacity) { uintptr_t* bitmap_begin = reinterpret_cast(mem_map.Begin()); const size_t bitmap_size = ComputeBitmapSize(heap_capacity); //我们根据创建的mem_map,调用SpaceBitmap构造函数,初始化 //----bitmap_begin SpaceBitmap内存基地址 //----bitmap_size SpaceBitmap的内存大小 //----heap_begin 标记的heap的内存基地址 //----heap_capacity 标记的heap的大小 return new SpaceBitmap(name, std::move(mem_map), bitmap_begin, bitmap_size, heap_begin, heap_capacity); } |