macOS平台下C语言运行时获取空闲堆内存的方法咨询
macOS下C语言运行时获取空闲堆内存的方法
关于你提供的getrusage代码
你贴的这段代码无法获取空闲堆内存:
ru_maxrss字段表示的是进程自启动以来占用的最大物理内存(驻留集大小),是进程已使用的内存量,和堆里的空闲空间完全无关。运行这段代码输出的数值只会反映进程用过的峰值内存,不是当前空闲堆内存。
关于malloc_size(NULL)的说法
这个说法不属实:
- macOS的
malloc_size函数要求参数必须是之前通过malloc/calloc/realloc分配的有效指针,传入NULL属于未定义行为,不会返回堆的空闲空间大小。实际调用时可能返回0或者导致程序崩溃,完全不可信。
正确的实现方法
macOS的malloc库提供了专门的统计接口malloc_zone_statistics,可以获取堆的详细内存信息,包括空闲内存。示例代码如下:
#include <stdio.h> #include <malloc/malloc.h> int main() { malloc_statistics_t stats; // 获取默认malloc zone的统计信息 malloc_zone_statistics(malloc_default_zone(), &stats); // 空闲堆内存大小(字节) printf("空闲堆内存: %llu bytes\n", stats.free_size); // 已分配堆内存大小 printf("已分配堆内存: %llu bytes\n", stats.size_in_use); // 堆总大小 printf("堆总大小: %llu bytes\n", stats.size_allocated); return 0; }
编译运行时不需要额外链接库,直接用gcc编译即可:
gcc -o heap_stats heap_stats.c ./heap_stats
说明
malloc_default_zone()获取进程默认的堆区域,如果你用了自定义malloc zone,需要对应替换。malloc_statistics_t结构体中的free_size字段就是当前堆里的空闲内存大小,包含了malloc库已从系统申请但未分配给用户的内存。
内容的提问来源于stack exchange,提问作者Luca Marchio
相关产品推荐
相关产品推荐

