当我运行一个继续分配内存的进程时,为什么Linux Free命令没有显示更少的可用内存

时间:2014-03-11 06:43:49

标签: linux memory malloc free-command

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:1)

Malloc'ed内存未映射到进程memoryspace,除非您触摸它。只有在分配的内存中获得pagefault时才会准备好此内存,内存应该映射到。

例如,您可以检查topVIRT列,其中包含malloc分配的内存的完整视图,但RES是实际内存使用情况,直到该时间点可能不是全部malloc内存被映射。

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