为什么如果 Linux 有 20G 的“缓存”内存(如“top”所示),malloc() 会返回 NULL?

为什么如果 Linux 有 20G 的“缓存”内存(如“top”所示),malloc() 会返回 NULL?

我的应用程序在尝试分配 16M 块时随机返回 OOM 错误,而 Linux 有足够的内存用于磁盘缓存(20G)。

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

使用 drop_caches 清除 Linux 缓存后,错误消失。

知道要检查什么吗?或者这是否是预期的行为?

答案1

内存充足,但可能碎片化,因此您无法获得 16mb 的连续块。Drop_caches 将触发内存碎片整理,因此之后有足够的连续内存可用来满足您的 malloc 请求。

(这个问题可能更适合在某个编程论坛上讨论。)

答案2

Malloc() 不分配物理内存,而是分配虚拟内存。Malloc() 可能会因虚拟内存不足(连续的空闲块)或超出提交限制而失败。

  1. ps使用、top或命令检查进程的虚拟内存使用情况pmamp。64 位架构(amd64)具有极大的虚拟内存,基本上不可能耗尽,但 32 位进程最多只能使用 4GB 的虚拟内存。
  2. 检查/proc/sys/vm/overcommit_memoryCommitted_ASCommitLimit中的行/proc/meminfo。如果 overcommit_memory 为 1,则超过 CommitLimit 将导致 malloc() 失败。

相关内容