跳转至

内存回收

文件页: 可直接回收的内存,比如buffer和cache

匿名页: 应用程序动态分配的堆内存

OOM_SCORE: 进程消耗的内存越多,oom_score就越大,oom_score内核通过内存消耗计算得出 ,可通过/proc文件系统设置进程的oom_adj或oom_score_adj来控制oom_score, oom_adj 的范围是[-17, 15],数值越大,表示进程越容易被oom杀死,其中-17表示禁止oom, oom_score_adj的范围是[-1000,1000],原理跟oom_adj一样,分值越高越容易被oom杀死,内核版本2.6.36后增加oom_score_adj替代oom_adj,为了兼容,目前新版本内核仍然保留oom_adj,当操作oom_adj时,内核实际上是会换算成oom_score_adj 当内存紧张的时候,内核通过 oom = oom_score + oom_score_adj 计算出分数最高的进程,向其发送关闭信号。

后台回收:内核线程kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作,其中pages_low=1.25倍pages_min,page_high=1.5倍pages_min,当pages_free < pages_low时,就会触发内存的回收,可以通过/proc/sys/vm/min_free_kbytes设置pages_min来控制kswapd0的回收时机

Swappiness: /proc/sys/vm/swappiness参数控制使用swap机制回收匿名页的积极程度,swappiness 的范围是0-100,默认值60,不过要注意的是,这个值只是调整swap积极程度的权重,即使你把它设置成0,当剩余内存加文件页小于page_high 时, 还是会发生swap , 可参考 https://www.kernel.org/doc/Documentation/filesystems/proc.txt

脏页:被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),这些脏页,一般可以通过两种方式写入磁盘。

  • 可以在应用程序中,通过系统调用 fsync ,把脏页同步到磁盘中;
  • 也可以交给系统,由内核线程 pdflush 负责这些脏页的刷新。