为什么malloc()可以返回NULL,如果Linux有20G'高速caching'的内存,如`top`所示?

我的应用程序随机返回尝试分配16M块的OOM错误,而Linux有大量的磁盘caching(20G)使用的内存。

交换禁用。 所有的操作系​​统限制似乎很好

用drop_caches清除Linuxcaching后,错误消失。

任何想法什么检查或者是不知何故预期的行为?

Malloc()不分配物理内存,它分配虚拟内存。 Malloc()可能由于缺less(连续的空闲块)的虚拟内存或超出提交限制而失败。

  1. 使用pstoppmamp命令检查进程的虚拟内存使用情况。 64位体系结构(amd64)具有非常大的虚拟内存,基本上不可能用尽,但32位进程将被限制在最多4GB的虚拟内存。
  2. 检查/proc/sys/vm/overcommit_memory /proc/meminfo /proc/sys/vm/overcommit_memory CommitLimitCommitted_ASCommitLimit行。 如果overcommit_memory为1,则超出CommitLimit将导致malloc()失败。

有很多的内存,但可能分散,所以你不能得到一个16MB的连续块。 Drop_caches将触发一个内存碎片整理,因此有足够的连续内存可用来履行你的malloc请求。

(这个问题可能更适合于编程论坛之一。)