为何调用free(NULL)会导致page reclaims(页面回收)数量增加?
为什么调用
free(NULL)会增加页面回收数? 首先看测试用的C代码:
#include <stdlib.h> int main() { free(NULL); return (0); }
使用BSD系统下的/usr/bin/time -l ./a.out命令统计程序运行的内存相关指标,调用free(NULL)时的结果如下:
0.00 real 0.00 user 0.00 sys 729088 maximum resident set size 0 average shared memory size 0 average unshared data size 0 average unshared stack size ----> 199 page reclaims 0 page faults 0 swaps 0 block input operations 0 block output operations 0 messages sent 0 messages received 0 signals received 0 voluntary context switches 1 involuntary context switches
而去掉free(NULL)调用后,页面回收数明显更低:
0.00 real 0.00 user 0.00 sys 716800 maximum resident set size 0 average shared memory size 0 average unshared data size 0 average unshared stack size ----> 195 page reclaims 0 page faults ...
原因解释
其实核心在于free(NULL)看似啥也没做,但会触发libc内存管理子系统的初始化流程:
- 当程序完全不调用任何malloc/free相关函数时,libc里负责内存分配的代码和数据段根本不会被加载到物理内存——程序启动后直接进入main,执行return就结束,全程碰不到内存管理的逻辑。
- 但一旦调用
free(NULL),哪怕参数是NULL,libc的free函数首先会检查自身的内存管理结构是否已经初始化。如果没初始化,就会执行一系列初始化操作:比如创建空闲内存块的链表、初始化内存池的元数据结构等。这些操作需要访问libc库中对应的代码页和数据页,而这些页面之前要么在磁盘的libc库文件里,要么被系统放在页面缓存中,此时需要把它们重新加载回物理内存,这就对应了统计结果里增加的页面回收数(page reclaims)。 - 同时最大驻留集大小的增长也印证了这一点:更多的libc页面被加载到内存,程序占用的物理内存自然变大。
内容的提问来源于stack exchange,提问作者Glitch
相关产品推荐
相关产品推荐

