细说|Linux Out Of Memory机制
- 更新日期:2025-07-06
- 查看次数:1195
有时候我们可能会碰到系统中某个进程突然挂掉的情况,查看系统日志后发现是由于系统的 oom(out of memory)机制 触发导致的。
今天我们来讨论一下 OOM机制 是什么,以及如何防止进程因为 OOM机制 而被终止。
什么是OOM机制
OOM 是 Out Of Memory 的缩写,意味着系统内存不足。OOM机制 是指当系统内存不足时,系统采取的应急措施。
当 Linux 内核发现系统中的物理内存不足时,首先会尝试回收可回收内存,主要包括:
- 用于读写文件的页缓存。
- 为了性能而延迟释放的空闲 slab 内存页。
内核会优先释放这些内存页,因为它们的释放不会影响系统的正常运行,只是为了提升系统性能。
如果释放这些内存后仍然不足,内核将会采取什么措施呢?它会触发 OOM killer,杀掉占用内存最多的进程,以释放更多内存。以下是一个示意图:

可以看出,OOM killer 是防止系统崩溃的最后一个手段,不到迫不得已的情况是不会触发的。
OOM killer 实现
接下来,我们分析一下内核是如何实现 OOM killer 的。
由于在 Linux 系统中,进程申请的都是虚拟内存地址。所以当程序调用 malloc() 申请内存时,如果虚拟内存空间足够的话,是不会触发 OOM 机制的。
当进程访问虚拟内存地址时,如果此虚拟内存地址还没有映射到物理内存地址的话,那么将会触发 缺页异常。
在缺页异常处理例程中,将会申请新的物理内存页,并且将进程的虚拟内存地址映射到刚申请的物理内存。
如果在申请物理内存时,系统中的物理内存不足,那么内核将会回收一些能够被回收的文件页缓存。如果回收完后,物理内存还是不足的话,那么将会触发 swapping机制(如果开启了的话)。
swapping机制 会将某些进程不常用的内存页写入到交换区(硬盘分区或文件)中,然后释放掉这些内存页,从而达到缓解内存不足的情况。
如果通过上面的手段还不能解决内存不足的情况,那么内核将会调用 pagefault_out_of_memory() 函数来杀掉系统中占用物理内存最多的进程。
我们来看看 pagefault_out_of_memory() 函数的实现:
void pagefault_out_of_memory(void)
{
...
out_of_memory(NULL, 0, 0, NULL, false);
...
}
登录后复制