4

我正在复习 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,<= 2Gb swap,HD 1TB(这有关系吗?)

任何人都知道它如何泄漏比我更多的内存

4

1 回答 1

4

  • http://www.win.tue.nl/~aeb/linux/lk/lk-9.html

    从 2.1.27 开始,有一个 sysctl VM_OVERCOMMIT_MEMORY 和 proc 文件 /proc/sys/vm/overcommit_memory ,其值为 1:做 overcommit,0(默认):不做。不幸的是,这不允许您告诉内核要更加小心,它只能让您告诉内核不要小心。将 overcommit_memory 设置为 1,每个 malloc() 都会成功。当设置为 0 时,使用旧的启发式,内核仍然过度使用。

您可能还希望查看使用 mallinfo 进行检测:

最后一个链接:

在某种程度上,Linux 分配内存的方式就像航空公司出售机票一样。一家航空公司将出售比实际座位更多的机票,希望一些乘客不会出现。Linux 中的内存以类似的方式管理,但实际上程度要严重得多。

于 2012-05-02T19:29:09.847 回答