当我运行这个片段时,我正在刷c,重做一些旧的练习并得到一些不寻常的结果(我知道它的泄漏,但想知道系统允许多少......)
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
void *page = 0; int index;
index = 0;
while(1)
{
page = malloc(1073741824); //1GB
if(!page)break;
++index;
}
printf("memory failed at %d\n",index);
return 0;
}
我实际上得到了:
内存在131070失败
这表明它认为它分配了131070 x 1GB内存(慷慨泄漏)
我之前已经理解malloc在使用所有虚拟内存之前应该会失败,当然如果我尝试在一个块中使用malloc 20GB,那么它就失败了。
我的设置: ubuntu 10 8Gb ram, &lt; = 2Gb swap, HD 1TB(这有关系吗?)
任何人都知道如何泄漏更多的内存
答案 0 :(得分:4)
从2.1.27开始,有一个sysctl VM_OVERCOMMIT_MEMORY和proc文件 / proc / sys / vm / overcommit_memory,值为1:do overcommit,和0 (默认):不要。不幸的是,这不允许你告诉 内核要更加小心,它只允许你告诉内核 不太小心。将overcommit_memory设置为1,每个malloc()都会 成功。当设置为0时,使用旧的启发式算法,内核仍然存在 overcommits。
最后一个链接:
在某种程度上,Linux以航空公司销售飞机的方式分配内存 门票。航空公司将售出的票数超过实际票数 座位,希望有些乘客不会出现。记忆 在Linux中以类似的方式管理,但实际上更多 严重程度。