• 常用
  • 百度
  • google
  • 站内搜索

游戏问答

细说|Linux Out Of Memory机制

  • 更新日期:2025-07-06
  • 查看次数:1195

有时候我们可能会碰到系统中某个进程突然挂掉的情况,查看系统日志后发现是由于系统的 oom(out of memory)机制 触发导致的。

今天我们来讨论一下 OOM机制 是什么,以及如何防止进程因为 OOM机制 而被终止。

什么是OOM机制

OOM 是 Out Of Memory 的缩写,意味着系统内存不足。OOM机制 是指当系统内存不足时,系统采取的应急措施。

当 Linux 内核发现系统中的物理内存不足时,首先会尝试回收可回收内存,主要包括:

  • 用于读写文件的页缓存。
  • 为了性能而延迟释放的空闲 slab 内存页。

内核会优先释放这些内存页,因为它们的释放不会影响系统的正常运行,只是为了提升系统性能。

如果释放这些内存后仍然不足,内核将会采取什么措施呢?它会触发 OOM killer,杀掉占用内存最多的进程,以释放更多内存。以下是一个示意图:

细说|Linux Out Of Memory机制

可以看出,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);
    ...
}

登录后复制

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken