【程序员必备小知识-内存知识26】内存回收的三种方式

228 阅读2分钟

引言

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

今天我们来详细说说内存回收,前面提了内存分配,回收是一个字没有提啊,那我们今天就来说一下。

内存回收的方式

当我们的内存紧张时,内核无非进行这三种方式回收内存,分别是:

  • 基于 LRU(Least Recently Used)算法,回收缓存;
  • 基于 Swap 机制;
  • 基于 OOM(Out of Memory)机制,杀掉占用大量内存的进程。

LRU(Least Recently Used)

是一种常见的页面置换算法,啥是页面置换呢,别急,遇事先百度,生活两不误。我们百度一下:

image.png

太多的没必要看,就是一种淘汰页的规则算法,为啥淘汰呢,因为要把访问的页面加载到内存,但是内存紧张,就不得不淘汰一页,新页换旧页就是置换

页面置换算法非常多,你就先知道LRU就行了:LRU什么原理呢?就是淘汰不常访问页,我们可以想象成一个栈,你访问数据我就压栈,但是栈的深度是有限的,再来新数据发现不够了,那就把栈底数据淘汰掉,就是这么个原理。

当然实现的时候也可以用两个双向链表,常用的数据就放在active,不常用的我就放inactive,我们可以在/proc/meminfo 中,查询它们的大小:

image.png

缓存回收和Swap 回收都是基于LRU算法。

OOM 机制

OOM机制就是当内存满了之后,我就选择性的干掉一些进程,以此来达到释放进程的目的,当然不是随便干的,是有一个得分标志:oom_score,该值越大的,优先干掉。

可以看到我这个没有溢出。 image.png

我们遇到这种情况的时候,能做的就是保护重要的进程,就减少重要进程的分值,调整进程的oom_score_adj参数,以达到保护进程的目的。