2016-11-30 99 views
0

系统信息:Linux版本2.6.32-573.12.1.el6.x86_64([email protected])(gcc版本4.4.7 20120313(Red Hat 4.4.7-16 )(GCC))#1 SMP周一年11月23十二时55分32秒EST 2015如何使用malloc()在redhat中分配比RAM更多的内存?

RAM 48 GB

问题:我想对malloc()100 GB存储器。但它不能在redhat系统上分配。

我发现100GB可以分配到8 GB RAM的macOS(铛编译)。我对此很困惑。

也许这个链接中描述的延迟分配? Why malloc() doesn't stop on OS X?

但是为什么linux系统不能?我尝试Ubuntu和Redhat,都没有达到。


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

  1. 回声 “1”>的/ proc/sys目录/ VM/overcommit_memory

  2. 的ulimit -v无限

+3

https://www.kernel.org/doc/Documentation/vm/overcommit-accounting –

+2

可能重复[malloc可以分配的最大内存](http://stackoverflow.com/questions/2798330/maximum-memory -which-malloc-can-allocate) – VolAnd

+1

出于好奇,为什么你需要分配100GB RAM? – Lundin

回答

0

可能的原因:

  1. 系统没有物理RAM或交换空间。

  2. 在32位模式下,过程大小限制被击中。

可能的解决方案:

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

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

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

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

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

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

+0

这是一个事实,即我想分配的内存超过RAM(100GB> 48GB)。但mac OS只有8GB RAM也可以malloc(100GB)。为什么? –

+0

redhat系统是64位版本。也许不在32位模式?增加物理记忆超出了我的意图。交换大小是4GB。我会检查第三个建议。 –

+0

您是否检查过Mac OS的交换空间。其实我在java应用程序中遇到了这个问题。那时候我的机器被进程加载了,交换空间非常少。 –

相关问题