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

为何C语言malloc分配内存远超系统实际内存却未被系统监控如实统计?

问题解答

首先明确:程序和系统监控都没错,差异来自Linux的内存管理机制,以及你对malloc行为的误解。

核心原因拆解

  • malloc的惰性分配(Lazy Allocation)
    Linux下的malloc并不会在调用时立刻分配物理内存,它只是在进程的虚拟地址空间里标记出一块可用的地址范围。只有当你真正往这块内存里写入数据时,操作系统才会触发缺页中断,分配实际的物理内存页。你的程序只做了malloc却没有写入任何数据,所以物理内存根本没被占用,系统监控自然显示内存使用率低。

  • 虚拟地址空间 vs 物理内存
    64位程序的虚拟地址空间非常大(理论上限达16EB),你程序打印的i * 16711568是虚拟地址空间的分配总量,这和系统的物理内存大小(3.8GiB)没有直接关联。系统监控统计的是物理内存的实际占用,两者统计的完全是不同维度的数据。

  • 关于"单次最大分配量"的误解
    你参考的文档是针对IBM i系统的,和Linux的malloc实现完全不同。Linux里malloc的单次最大可分配量取决于当前进程剩余的虚拟地址空间大小,没有固定数值。

验证方法:真正消耗物理内存

如果想让程序实际占用物理内存,只需要在malloc后写入数据即可,比如用memset填充内存:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
   unsigned long i = 0;
   void *ptr;
   while(1) {
      ptr = malloc(16711568);
      if (!ptr) { // 处理分配失败的情况
          perror("malloc failed");
          break;
      }
      memset(ptr, 0, 16711568); // 写入数据,触发物理内存分配
      i++;
      printf("Iteration %lu: %lu total bytes allocated\n", i, i * 16711568);
   }
   return 0;
}

运行修改后的程序,你会看到系统监控的内存占用开始快速上升,直到物理内存+交换空间耗尽,程序会被Linux的OOM Killer终止。

内容的提问来源于stack exchange,提问作者Alexandra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:18:13