为何mallinfo的hblks/hblkhd字段未统计mmap分配信息?
问题:手动调用mmap后,mallinfo的hblks/hblkhd字段为何始终为0?
mallinfo结构体的hblks和hblkhd字段,手册说明分别用于统计mmap分配的块数量和总字节数。但执行以下代码后,这两个字段仍为0,同时系统可用字节总数出现减少:
void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); *(int *) ptr = 10;
即使耗尽ptmalloc管理的空闲空间后再调用mmap,hblks和hblkhd依然保持为0。使用环境:gcc 9.4.0,Ubuntu 20.04.1。
原因分析
mallinfo是glibc内存分配器(ptmalloc)提供的统计接口,它仅统计ptmalloc自身主动调用mmap分配的内存块——这些内存是ptmalloc为了处理大内存分配(默认超过128KB的MMAP_THRESHOLD阈值)而向内核申请的,后续由ptmalloc负责管理、复用或释放。- 手动调用的
mmap是直接向内核申请内存,完全绕过了ptmalloc的管理机制,ptmalloc对这部分内存的存在一无所知,因此不会将其纳入hblks和hblkhd的统计范围。 - 观察到的“可用字节总数减少”是系统全局内存的变化,和
mallinfo统计的ptmalloc管理内存属于不同维度,二者没有关联。
内容的提问来源于stack exchange,提问作者Vadim Sadokhov
相关产品推荐
相关产品推荐

