【问题标题】:How to use malloc() allocates memory more than RAM in redhat?如何在redhat中使用malloc()分配的内存多于RAM?
【发布时间】:2017-04-14 19:11:14
【问题描述】:

系统信息: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 EST 2015

内存 48 GB

问题:我想 malloc() 100 GB 内存。但是在redhat系统上分配失败。

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

也许这个链接中描述了惰性分配? Why malloc() doesn't stop on OS X?

但是为什么linux系统不能呢?我尝试了ubuntu和redhat,都失败了。


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

  1. echo "1" > /proc/sys/vm/overcommit_memory

  2. ulimit -v 无限制

【问题讨论】:

标签: c linux memory


【解决方案1】:

可能的原因:

  1. 系统的物理 RAM 或交换空间不足。

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

可能的解决方案:

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

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

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

我认为这些点可以帮助您了解 malloc 失败问题。

输入验证。例如,您在一次分配中请求了许多 GB 的内存。确切的限制(如果有)因 malloc 实现而异; POSIX 没有说明最大值,只是它的类型是 size_t。

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

【讨论】:

  • 这是一个事实,我想要分配的内存比 RAM (100GB > 48GB) 多。但是 mac OS 只有 8GB RAM 也可以 malloc(100GB)。为什么?
  • redhat系统是64位发行版。也许不在 32 位模式下?增加物理内存不是我的本意。交换大小为 4GB。我会检查第三个建议。
  • 您是否检查过 Mac OS 的交换空间。实际上我在java应用程序中遇到了这个问题。当时我的机器被进程超载,交换空间非常少。
  • @Yuanshengliu MacOS 是 64 位系统,具有动态虚拟内存,它可以让您分配大块内存(它的惰性分配在这种情况下非常有用)。 Linux(取决于版本)有不同的限制。
  • 其实我不知道Mac OS。所以不能多说。
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2012-10-10
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多