故障的 malloc 条件

malloc conditions for failure

本文关键字:条件 malloc 故障      更新时间:2023-10-16

我正在复习 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 %dn",index);
    return 0;
}

我实际上得到了:

内存在 131070 时出现故障

这表明它认为其分配的 131070 x 1GB 内存(大量泄漏(

我以前了解malloc应该在消耗所有虚拟内存之前失败,当然,如果我尝试在一个块中malloc 20GB,这将失败。

我的设置:乌班图108Gb 内存,<= 2Gb 交换,高清 1TB(这重要吗?

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

  • 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:执行过度提交,0 (默认值(:不要。不幸的是,这不允许你告诉 内核要更加小心,它只允许你告诉内核 不太小心。当overcommit_memory设置为 1 时,每个 malloc(( 将 成功。当设置为 0 时,使用旧的启发式方法,内核仍然 过度承诺。

您可能还希望查看带有mallinfo的仪器:
  • http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html

最后一个环节:

  • http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html

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