文档首页/ Huawei Cloud EulerOS/ 常见问题/ 系统内存回收机制说明
更新时间:2025-09-25 GMT+08:00
分享

系统内存回收机制说明

Linux系统启动内存回收的时机

  1. kswapd 后台回收(异步)。
    • 内核的守护线程 kswapd会不断检查内存水位:
      • high:正常,不回收。
      • low:唤醒 kswapd,尝试回收一些页。
      • min:即使 kswapd 也没来得及回收,系统非常紧张。
    • 特点:后台执行,不阻塞进程,属于“温和的内存回收”。
  2. direct reclaim 前台回收(同步)。
    • 当某个进程分配内存时发现系统内存不够,会直接触发回收。
    • 特点:这个回收过程是同步的,会阻塞进程执行。
  3. OOM
    • 如果直接内存回收后,空闲的物理内存仍然无法满足此次物理内存的申请,那么内核就会触发OOM机制(kill进程或者panic)。

Linux系统内存回收策略

  1. 优先回收 page cache(文件页)。
    • 如果是 clean page:直接丢掉 → 成本最低。
    • 如果是 dirty page:写回磁盘再丢掉。
  2. 回收 slab 缓存(dentry/inode 等内核对象)。
    • 内核自身的对象缓存(slab/slub 分配器管理的内存),这些缓存大多可以回收(比如 dentry cache、inode cache)。
    • 内核会通过 shrinker 机制(shrink_slab())来释放部分。
  3. 回收匿名页(堆/栈) → swap。
    • 匿名页 = 进程的堆、栈、malloc 出来的内存。这类内存没有磁盘后备存储,如果要回收,就必须写到 swap 分区。内核会把不活跃的匿名页写到 swap 分区,再释放物理页。
    • 代价比回收缓存要高得多。
  4. 最后 OOM Kill。
    • 如果 page cache 已经回收、swap 已经写满,还是没办法满足内存需求,Linux 会触发 OOM Killer。

相关文档