我向calloc内存写了一些代码,直到没有更多可用的内容。
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
int *p;
int count = 0;
while(1)
{
int inc=1024*1024*sizeof(char);
p=(int*) calloc(1,inc);
count++;
if(!p)
{
cout << "managed to allocate " << (count * 1024 * 1024) / 1000000000.0 << " gb\n";
return 1;
}
}
}
在Visual Studio中的Windows上执行上述代码我得到以下内容:
managed to allocate 1.9881 gb
Press any key to continue . . .
然而,当我把它带到我的Linux系统并使用以下代码编译和运行时:
g++ mem.cpp
./a.out
该过程稍后会被操作系统杀死。
即使分配的内存不存在,似乎calloc也不会返回null?
如果是这种情况,那么如何修改现有代码以在Linux上实现与在Windows上相同的效果?
答案 0 :(得分:1)
这是因为Linux&#34; overcommits&#34;记忆。 Linux上的进程可以分配比实际可用内存更多的内存。仅在实际使用内存时才分配物理内存。
当Linux耗尽可用物理内存时,它会开始终止进程,直到内存被释放。
您可以使用以下方法在系统范围内禁用此行为:
sudo sysctl -w vm.overcommit_memory=2
它将确保所有分配的物理内存实际存在。这可能不是一个好主意。许多程序依赖于这种行为并分配了大量从未使用过的内存。
消耗所有可用内存也不是一个好主意。您的程序可能不是无法分配内存的程序或OOM杀手杀死的程序。您正在影响系统中的所有进程。