1

我编写了一个 C 程序,在其中我使用 malloc 连续分配内存(1 MB 大小)。我不释放这个内存。当这个程序运行时,我调用了 linux free 命令并期望,使用的内存应该逐渐增加,而内存空闲应该减少。但这并不期望。Free 命令输出几乎保持不变。知道为什么使用 malloc 分配的内存没有显示在 Memory used 中吗?

4

2 回答 2

5

当您malloc依次调用它时(通过sbrkmmap)从内核请求内存,并且操作系统只是随便给它内存,而没有实际为进程分配它。这是一个乐观的策略;实际上,操作系统“希望”该进程甚至永远不会使用内存。

当进程最终从内存中写入(或读取)时,它会出错并且操作系统会说“ok FINE,如果你坚持的话”并实际分配内存。

您可以通过逐渐写入内存来看到这一点:

char *mem = malloc(PAGE_SIZE * 100);
for (i = 0; i < 100; ++i) {
    getchar();
    mem[PAGE_SIZE * i] = 42;
}

这样做的一个副作用是,您可以轻松地分配malloc比系统更多的内存。通过写入它,你最终会达到一个限制,你的进程将被杀死。

于 2014-03-11T06:47:09.070 回答
1

Malloc'ed memory isn't mapped into process memoryspace unless you touch it. This memory will only be ready when the it get a pagefault in the allocated memory, the memory should be mapped in.

For example you can check top, for VIRT column which has complete view of assigned memory by malloc but RES is the real memory usage till that point of time where may not all the malloc memory is mapped.

PID   USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+ COMMAND              
4841  esunboj   20   0 1350m 457m  49m S   25 12.9  43:04.26 firefox
于 2014-03-11T07:04:07.627 回答