
# 系统内存回收机制说明
#### Linux系统启动内存回收的时机
1. kswapd 后台回收（异步）。
   - 内核的守护线程 kswapd会不断检查内存水位：
     - high：正常，不回收。
     
     - low：唤醒 kswapd，尝试回收一些页。
     
     - min：即使 kswapd 也没来得及回收，系统非常紧张。
      
   
   - 特点：后台执行，不阻塞进程，属于"温和的内存回收"。
    
2. direct reclaim 前台回收（同步）。
   - 当某个进程分配内存时发现系统内存不够，会直接触发回收。
   
   - 特点：这个回收过程是同步的，会阻塞进程执行。
    
3. OOM
   - 如果直接内存回收后，空闲的物理内存仍然无法满足此次物理内存的申请，那么内核就会触发OOM机制回收内存。
    
 
#### 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。
    
 
