内存回收的方式
文件页 : 可直接回收的内存,比如 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 负责这些脏页的刷新。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论