[英]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.