1、Swap机制是什么 :
Swap机制是一种利用磁盘空间来扩展内存的方法。当系统的物理内存不足时,可以把一些不常用的内存数据写入到磁盘上的Swap分区,从而释放出更多的内存给其他需要的进程。当这些内存数据再次被访问时,系统会把它们从磁盘读回到内存中,这个过程称为换入(swap in)。相反,把内存数据写入到磁盘的过程称为换出(swap out),应用程序实际可以使用的内存空间将远远超过系统的物理内存。Swap 就是把一块磁盘空间或者本地文件,当成内存来使用。
Swap换入换出过程如下:
2、哪些内存能被回收:
- 文件页的回收:文件页就是我们类似于正常的文件,有具体记录,从磁盘中读取过来的。当回收干净页(没有修改过的文件)时,直接将其内存释放就好,等下次需要时再从磁盘读取。但是如果是脏页(有被修改过的文件),我们需要将其先写入磁盘,改变磁盘中的源文件,再进行内存释放。
- 匿名页的回收:匿名页没有实际载体,不像文件缓存有硬盘文件这样一个载体,像是堆、栈这种程序运行数据。这些页的回收我们就需要用到Swap进制,将这个部分的内存先写入到Swap分区,再进行内存释放。
从回收的过程中我们可以看到除了回收干净文件页外,其他的都有磁盘io的过程,所以这个回收的过程是会损耗系统性能的。
3、内存回收什么时候触发:
再介绍什么时候触发前,先介绍两种内存回收的方式:
- 后台内存回收(kswapd):在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行。
- 直接内存回收(direct reclaim):如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行。
在内存中有三个阈值,分别是“页高阈值”、“页低阈值”、“最小阈值”。再内存空闲大小低于页低阈值时,会进行后台内存回收,直至空闲内存大小高于页低阈值。当这种回收方式无法跟上程序需要内存的需求,空闲内存大小低于最小阈值时则会直接触发直接内存回收。因为这个回收是同步的,会阻塞程序执行。这样的话太影响系统性能了。
4、如何降低内存对系统性能的损耗:
- 从回收页类型看,回收干净页不需要磁盘io。所以通过配置文件,尽量倾向于回收文件页。
- 通过调整页低阈值,将kswapd回收时机提前,避免直接内存回收的产生,因为直接内存回收是同步回收,太损耗性能了。