【问题标题】:malloc conditions for failuremalloc 失败的条件
【发布时间】:2012-05-12 07:30:36
【问题描述】:

我正在复习 c,重做一些旧练习并在运行这个 sn-p 时得到一些不寻常的结果(我知道它会泄漏,但想知道系统允许多少..)

#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 内存,

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

【问题讨论】:

  • 这里的答案很大程度上取决于您使用的操作系统,因为有些(著名的 linux)愿意“过度提交”,这意味着如果有一个 地址,malloc 将返回成功可用而无需过多担心内存的可用性
  • 建议:您可能想使用 mallinfo 进行检测:gnu.org/software/libc/manual/html_node/…
  • amd64 和 ulimit 确实说最大内存无限制,但是它怎么能超过 HD 1TB 限制呢
  • Linux 就是这样一个乐观主义者。它希望在您尝试使用其他部分之前,您将完成一些您请求的内存(因此它必须实际使它们可用)。
  • 我认为 Firefox 开发人员正在尝试这个完全相同的测试,但他们忘记在发布版本中将其注释掉......

标签: c++ c memory memory-management memory-leaks


【解决方案1】:

  • 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 进行检测:

最后一个链接:

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

【讨论】:

  • 该信息已过时。 1 表示“过度使用”,但 0 不表示“不”。 0 只是意味着“避免最严重的过度使用情况”。有一个新选项 2 是在很久以后才添加的,这实际上意味着“不要过度使用。”
  • 并且任何正确配置的系统都应该将 sysctl 设置为 2。
  • 不,2 表示服从 vm.overcommit_ratio sysctl:kernel.org/doc/Documentation/vm/overcommit-accounting
  • @amdixon:正确的做法是简单地检查malloc的返回值。解决配置错误的系统不是您的工作。但是您也不应该认为分配尽可能多的内存是可以的。而是只分配你需要的东西。您的程序(通常)不是在用户机器上运行的唯一程序。如果你只分配你需要的东西,你的用户就不太可能遇到你的程序内存不足的情况,除非其他程序行为不端。
  • echo "2" &gt; /proc/sys/vm/overcommit_memory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2011-09-13
  • 2012-12-14
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多