You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:00:17