引言
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
今天我们来详细说说内存回收,前面提了内存分配,回收是一个字没有提啊,那我们今天就来说一下。
内存回收的方式
当我们的内存紧张时,内核无非进行这三种方式回收内存,分别是:
- 基于 LRU(Least Recently Used)算法,回收缓存;
- 基于 Swap 机制;
- 基于 OOM(Out of Memory)机制,杀掉占用大量内存的进程。
LRU(Least Recently Used)
是一种常见的页面置换算法,啥是页面置换呢,别急,遇事先百度,生活两不误。我们百度一下:
太多的没必要看,就是一种淘汰页的规则算法,为啥淘汰呢,因为要把访问的页面加载到内存,但是内存紧张,就不得不淘汰一页,新页换旧页就是置换。
页面置换算法非常多,你就先知道LRU就行了:LRU什么原理呢?就是淘汰不常访问页,我们可以想象成一个栈,你访问数据我就压栈,但是栈的深度是有限的,再来新数据发现不够了,那就把栈底数据淘汰掉,就是这么个原理。
当然实现的时候也可以用两个双向链表,常用的数据就放在active,不常用的我就放inactive,我们可以在/proc/meminfo 中,查询它们的大小:
缓存回收和Swap 回收都是基于LRU算法。
OOM 机制
OOM机制就是当内存满了之后,我就选择性的干掉一些进程,以此来达到释放进程的目的,当然不是随便干的,是有一个得分标志:oom_score,该值越大的,优先干掉。
可以看到我这个没有溢出。
我们遇到这种情况的时候,能做的就是保护重要的进程,就减少重要进程的分值,调整进程的oom_score_adj参数,以达到保护进程的目的。