我写了这个程序来了解内存消耗模式。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0;
while(1 < 2) {
int *str = (int *) malloc(100000000);
if(str == NULL) {
printf("Out of memory.. %d", i);
return(1);
}
printf("Attempt Count = %d\n", i++);
}
return(0);
}
在我的系统中,我有8 GB内存。每个malloc调用将尝试存储100MB。所以我期待我的程序会在(10 * 8)循环中崩溃。但柜台远远超过60万。我无法推断出同样的原因。请帮助。
即使考虑所有交换空间和所有交换空间,它也不应该增加超过16GB,这在这里看起来不太可能。
答案 0 :(得分:4)
那是因为在Linux中,malloc
内存尚未使用,因为你没有初始化内存。
你可以malloc
超过你拥有的内存(物理+虚拟),因为内核会延迟你的内存分配,直到你真正使用它为止。我相信,为了增加你的程序因内存限制而失败的机会,但这不是问题。
calloc
与malloc
相同,但零会初始化内存。当您向Linux请求内存页面时,Linux已将其初始化为零。因此,如果calloc
可以告诉它所要求的内存只是从内核请求的,那么它实际上不必将其初始化为零!由于它没有,因此无法访问该内存,因此它应该能够请求比实际更多的内存。
检查this回答。它提供了一个非常好的解释。
此程序也不会因malloc
NULL
崩溃而导致空间不足而导致{{1}}。
答案 1 :(得分:1)
在现代操作系统中,进程使用的内存是虚拟内存,不受物理RAM大小的限制。它使用磁盘上的交换空间来允许比RAM大得多的进程。
此外,某些操作系统允许过度使用。您可以分配比交换空间中实际可用的虚拟内存更多的虚拟内存。只有在其中一个进程实际尝试使用过多内存时才会发生失败。