You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何内存泄漏程序未被OOM Killer终止反而出现阻塞?

问题原因分析

你的程序未被OOM Killer终止反而出现阻塞,核心原因可归结为两点:

1. Linux内存的延迟分配机制

Linux下malloc()调用仅会向内核申请虚拟地址空间,并不会直接分配物理内存。只有当程序实际读写这块申请到的内存时,才会触发缺页中断,内核才会真正为进程分配物理页。

你的代码只执行内存申请操作,没有对申请到的内存做任何读写,因此进程实际占用的物理内存极少,完全达不到OOM Killer的触发条件——OOM Killer仅会在系统物理内存+交换空间耗尽时,选择占用内存资源较多的进程进行终止。

2. 进程虚拟地址空间耗尽

64位Linux进程的虚拟地址空间通常受硬件和内核配置限制,一般采用48位寻址,对应最大可用虚拟空间为2^47字节(即128TB)。你的程序每次循环申请1GB内存,131063 * 1GB ≈ 128TB,此时进程的虚拟地址空间已接近耗尽,malloc()无法再申请到新的虚拟地址,进而进入内核的资源等待逻辑,导致程序阻塞、内存占用不再增长。

验证触发OOM Killer的方法

若想触发OOM Killer,可在malloc()成功后添加内存读写操作,强制内核分配物理内存:

char* p = static_cast<char*>(malloc(kBytes));
if (p != nullptr) {
    memset(p, 0, kBytes); // 触发物理内存分配
}

修改后程序会快速耗尽物理内存与交换空间,很快就会被OOM Killer终止。

内容的提问来源于stack exchange,提问作者Kang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:56:04