|
-----------Create-------------------------------------------------
SpaceBitmap<kAlignment>* SpaceBitmap<kAlignment>::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<kAlignment>::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<size_t kAlignment>
SpaceBitmap<kAlignment>* SpaceBitmap<kAlignment>::CreateFromMemMap(const std::string& name, MemMap&& mem_map, uint8_t* heap_begin, size_t heap_capacity) {
uintptr_t* bitmap_begin = reinterpret_cast<uintptr_t*>(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);
}
|