更新时间:2025-09-25 GMT+08:00
系统内存回收机制说明
Linux系统启动内存回收的时机
- kswapd 后台回收(异步)。
- 内核的守护线程 kswapd会不断检查内存水位:
- high:正常,不回收。
- low:唤醒 kswapd,尝试回收一些页。
- min:即使 kswapd 也没来得及回收,系统非常紧张。
- 特点:后台执行,不阻塞进程,属于“温和的内存回收”。
- 内核的守护线程 kswapd会不断检查内存水位:
- direct reclaim 前台回收(同步)。
- 当某个进程分配内存时发现系统内存不够,会直接触发回收。
- 特点:这个回收过程是同步的,会阻塞进程执行。
- OOM
- 如果直接内存回收后,空闲的物理内存仍然无法满足此次物理内存的申请,那么内核就会触发OOM机制(kill进程或者panic)。
Linux系统内存回收策略
- 优先回收 page cache(文件页)。
- 如果是 clean page:直接丢掉 → 成本最低。
- 如果是 dirty page:写回磁盘再丢掉。
- 回收 slab 缓存(dentry/inode 等内核对象)。
- 内核自身的对象缓存(slab/slub 分配器管理的内存),这些缓存大多可以回收(比如 dentry cache、inode cache)。
- 内核会通过 shrinker 机制(shrink_slab())来释放部分。
- 回收匿名页(堆/栈) → swap。
- 匿名页 = 进程的堆、栈、malloc 出来的内存。这类内存没有磁盘后备存储,如果要回收,就必须写到 swap 分区。内核会把不活跃的匿名页写到 swap 分区,再释放物理页。
- 代价比回收缓存要高得多。
- 最后 OOM Kill。
- 如果 page cache 已经回收、swap 已经写满,还是没办法满足内存需求,Linux 会触发 OOM Killer。