tcmalloc是内存管理的一个库,非常好用以及高效。libhugetlbfs是大页内存管理,提高tlb命中率,对程序来说也是一个非常好以及高效的一个库。
现在我们要将两个库进行结合。第一:从动态库的层面来说,两者如果单独使用只需要在编译的时候连接这两个库就OK了。但是,但是,但是,如果两者结合使用,同时连接这两个库,你会发现最终的只会是其中的某一个库在运行,或者说只有tcmalloc在运行,大页内层根本没有使用。第一失败了,那么就是第二了。第二:从代码层面说,代码是无所不能的,那么我们研究代码,发现tcmalloc其实也要分配内存,找到它分配内存的地方进行修改。还好大页内存给了代码调用的接口。
其实我们在跟踪的时候,会发现最后在中央内存分配的时候,有几种分配方式,有sbrk的,有mmap的。
在system-alloc.cc文件中
void InitSystemAllocators(void) {
MmapSysAllocator *mmap = new (mmap_space) MmapSysAllocator();
SbrkSysAllocator *sbrk = new (sbrk_space) SbrkSysAllocator();
// In 64-bit debug mode, place the mmap allocator first since it
// allocates pointers that do not fit in 32 bits and therefore gives
// us better testing of code's 64-bit correctness. It also leads to
// less false negatives in heap-c