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

为何C语言程序任务管理器实际内存占用与理论值不符?

#include <stdio.h>
#include <unistd.h>
typedef struct kk {
  char k[1000000];
} uuuu;
uuuu k[1000];
int main() {
  sleep(100);
  return 0;
}

问题描述

该C语言程序的理论内存占用应为1Byte * 1000000 * 1000 = 1GB;但任务管理器显示实际内存占用仅961KB!由于全局变量应被初始化为0,按理应占用全部对应内存空间,恳请专业人士解释此差异原因。

原因解析
  • 虚拟内存的按需分配机制:现代操作系统采用虚拟内存管理,程序的虚拟地址空间会预先划定范围,但物理内存只会在代码实际访问某块内存区域时才会完成映射分配。你的代码里只是定义了全局数组,却从未读取或修改数组内的任何元素,因此操作系统不会为这些数组分配真实的物理内存页。

  • .bss段的零页优化:初始化为0的全局变量会被编译器放到.bss段(未初始化的全局变量也归于此段,会被统一初始化为0)。操作系统对.bss段有特殊优化:它不会为全零的.bss区域预先分配物理内存,而是将其映射到系统共享的零页(一块内容全为0的物理内存页)。只有当你修改.bss段中某个内存页的内容时,操作系统才会触发写时复制机制,为该页分配独立的物理内存并复制零页内容。你的程序全程未触碰数组元素,因此始终只使用零页的映射,不会占用额外物理内存。

  • 任务管理器的统计逻辑:任务管理器显示的是程序实际占用的物理内存(如Windows的“工作集”、Linux的RES指标),而非程序的虚拟地址空间大小。如果查看虚拟内存占用,你会发现数值接近1GB,但物理内存因为没有被实际访问,所以未被分配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:55:15