我编写了一个C程序,我使用malloc连续分配内存(大小为1 MB)。我不释放这段记忆。当这个程序运行时,我调用linux free命令,并期望使用的内存应该逐渐增加,内存空闲应该减少。但这并不期望。 Free命令输出几乎保持不变。 知道为什么使用malloc分配的内存没有显示在使用的内存中吗?
答案 0 :(得分:5)
当你调用malloc
时,它会从内核请求内存(通过sbrk
或mmap
),操作系统只是随便给它内存,而不是实际为进程分配内存。这是一种乐观的策略;实际上操作系统“希望”这个过程永远不会使用内存。
当进程最终从内存中写入(或读取)时,它会出现故障并且操作系统会说“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
时才会准备好此内存,内存应该映射到。
例如,您可以检查top
,VIRT
列,其中包含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