我的应用程序在尝试分配 16M 块时随机返回 OOM 错误,而 Linux 有足够的内存用于磁盘缓存(20G)。
已禁用交换。所有操作系统限制似乎都很好。
使用 drop_caches 清除 Linux 缓存后,错误消失。
知道要检查什么吗?或者这是否是预期的行为?
答案1
内存充足,但可能碎片化,因此您无法获得 16mb 的连续块。Drop_caches 将触发内存碎片整理,因此之后有足够的连续内存可用来满足您的 malloc 请求。
(这个问题可能更适合在某个编程论坛上讨论。)
答案2
Malloc() 不分配物理内存,而是分配虚拟内存。Malloc() 可能会因虚拟内存不足(连续的空闲块)或超出提交限制而失败。
ps
使用、top
或命令检查进程的虚拟内存使用情况pmamp
。64 位架构(amd64)具有极大的虚拟内存,基本上不可能耗尽,但 32 位进程最多只能使用 4GB 的虚拟内存。- 检查
/proc/sys/vm/overcommit_memory
和Committed_AS
和CommitLimit
中的行/proc/meminfo
。如果 overcommit_memory 为 1,则超过 CommitLimit 将导致 malloc() 失败。