如何使用malloc()在redhat中分配内存多于RAM?

时间:2016-11-30 12:46:25

标签: c linux memory

系统信息:Linux版本2.6.32-573.12.1.el6.x86_64(mockbuild@x86-031.build.eng.bos.redhat.com)(gcc版本4.4.7 20120313(Red Hat 4.4.7-) 16)(GCC))#1 SMP Mon Nov 23 12:55:32 2015

RAM 48 GB

问题:我想要malloc()100 GB内存。但它无法在redhat系统上进行分配。

我发现可以在带有8 GB RAM的macOS中分配100GB(clang编译)。我对此非常困惑。

这个链接中可能有懒惰分配? Why malloc() doesn't stop on OS X?

但是为什么linux系统不能?我尝试使用ubuntu和redhat,但都没有达到目的。

结果: 经过调查,我发现以下两个步骤会让malloc()无限制:

  1. echo" 1" >的/ proc / SYS / VM / overcommit_memory

  2. ulimit -v unlimited

1 个答案:

答案 0 :(得分:0)

可能的原因:

  1. 系统超出物理RAM或交换空间。

  2. 在32位模式下,已达到进程大小限制。

  3. 可能的解决方案:

    1. 减少系统上的内存负载。

    2. 增加物理内存或交换空间。

    3. 检查交换后备存储是否已满。

    4. 我认为这一点可以帮助您了解malloc故障问题。

      输入验证。例如,您在单个分配中要求许多千兆字节的内存。确切的限制(如果有的话)因malloc实现而异; POSIX没有说明最大值,其类型不是size_t。

      分配失败。使用基于数据段的malloc,这意味着brk失败了。当新数据段无效,系统内存不足或进程超出其最大数据段大小(由RLIMIT_DATA指定)时,会发生这种情况。使用基于映射的malloc,这意味着mmap失败。当进程超出虚拟内存(由RLIMIT_AS指定),超出其映射限制或请求过大的映射时,会发生这种情况。注意大多数现代Unix系统使用brk和mmap的组合来实现malloc,根据请求的分配大小在两者之间进行选择。