1. 内存资源紧张的时候,可能会发生两种情况
内存回收
OOM
2. 内存回收分析:
可回收:缓存、缓冲区、文件映射⻚ ,他们通常叫做文件页。
有些文件页被修改了,但是还没有同步到磁盘,这些叫做脏页,需要先写入磁盘,然后才能回收。
不可直接回收:应用程序动态分配的堆内存 (匿名页)。如果这些内存在分配后很少被访问 ,可以先暂时存放在磁盘上面,后面需要的时候再读取。(这就是 swap)
3. 脏页如何回收:
应用程序:调用syscall fsync
内核线程 pdflush
4. swap:
Swap说白了就是把一块磁盘空间或者一个本地文件(以下讲解以磁盘为例),当成内存来使用。 它包括换出和换 入两个过程。
我们常⻅的笔记本电脑的休眠和快速开机的功能,也基于Swap 。休眠时,把系统的内存存入磁盘,这样等到再次 开机时,只要从磁盘中加载内存就可以。这样就省去了很多应用程序的初始化过程,加快了开机速度。
kswapd0
:专⻔的内核线程用来定期回收内存 ,定期扫描
5. 为什么内存还有很多,还是会有 swap?
处理器 NUMA 架构:多个处理器被划分到不同 Node 上,且每个 Node 都拥有 自己的本地内存空间。
numactl —hardware
cat /proc/zoneinfo
该图中,free 远高于 min,所以kswapd0
不会回收内存
cat /proc/sys/vm/zone_reclaim_mode
默认的 0 ,也就是刚刚提到的模式,表示既可以从其他 Node 寻找空闲内存,也可以从本地回收内存。
1、2、4 都表示只回收本地内存,2 表示可以回写脏数据回收内存,4 表示可以用 Swap 方式回收内存。
swappiness
倾向于使用 swap 的程度。
/proc/sys/vm/swappiness
6. 内存回收机制
回收文件页:直接回收,或者把脏页写入磁盘后再回收
回收匿名页:swap 机制,写入磁盘再回收内存