[英]Why is malloc not “using up” the memory on my computer?
因此,我有一个分配256 MB内存的程序,在用户按下ENTER键后,它将释放内存并终止。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *p, s[2];
p = malloc(256 * 1024 * 1024);
if ( p == NULL)
exit(1);
printf("Allocated");
fgets(s, 2, stdin);
free(p);
return 0;
}
我多次运行了该程序并将它们分别作为背景,直到不再有足够的内存可以分配。 但是,那永远不会发生。 我运行了linux top
命令,即使多次运行该程序,可用内存也不会减少多达256 MB。
但是,另一方面,如果我使用calloc
而不是malloc
则存在巨大的差异:
p = calloc(256 * 1024 * 1024, 1);
现在,如果我运行该程序并使其后台运行,然后重复执行,则每次运行它时,可用内存都会减少256 MB。 为什么是这样? 为什么malloc
不会导致可用的空闲内存改变,而calloc
会改变?
malloc()
不使用内存。 它分配它。
分配内存后,通过分配一些数据来使用它。
size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
memset(p, 123, Size);
}
某些平台实现malloc()
的方式是,在访问该字节(或更可能是字节组或字节的“页”中的某个字节)之前,不会发生内存的物理消耗。
calloc()
可能会也可能不会真正使用内存。 系统可以将大量内存映射到相同的物理归零内存,至少直到数据变得有趣为止。 请参见为什么malloc + memset比calloc慢?
内存可能没有真正可用,尤其是在示例中您没有使用p
做任何事情,只是检查它是否为NULL
。 来自man malloc
默认情况下,Linux遵循乐观的内存分配策略。 这意味着,当
malloc()
返回非NULL
,不能保证内存确实可用。 万一发现系统内存不足,OOM杀手将杀死一个或多个进程。 有关详细信息,请参阅的描述/proc/sys/vm/overcommit_memory
和/proc/sys/vm/oom_adj
在proc(5)
和Linux内核源文件文档/vm/overcommit-accounting
。
您的系统†上的calloc
实际上是通过清除内存来触摸内存的,在许多系统上,直到分配进程触摸到该内存后,才真正分配(因此“用完”)内存。 因此,仅当您使用好malloc
它才“使用”内存。
† 看评论
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.