Linux 内存是如何被分配和回收的?

舞夢輝影

舞夢輝影

2026-01-26

857人浏览

原创

malloc仅分配虚拟内存,物理页在首次读写触发缺页异常时才由伙伴系统分配;若空闲页不足,则在page fault阶段立即启动内存回收。

linux 内存是如何被分配和回收的?

内存分配:从 malloc 到物理页框,中间发生了什么

Linux 进程调用 malloc 申请内存时,实际只在虚拟地址空间划出一块区域,**并不立即分配物理内存**——这是 lazy allocation(惰性分配)的核心。真正触发物理页分配的,是第一次读写该地址时引发的缺页异常(page fault),内核此时才通过伙伴系统(buddy system)从对应 zone 中找一个空闲页框,建立页表映射。

关键点在于:用户态看到的是虚拟地址,而内核按需把物理页“贴”上去。如果此时空闲页不足,就会立刻进入回收流程——不是等 malloc 返回失败,而是卡在 page fault 阶段。

  • 小对象(slab 或 slub 分配器,复用已缓存的对象,避免频繁拆分/合并页
  • 大块内存(如 mmap 分配)可能直接从伙伴系统拿整页或多页,不经过 slab
  • 匿名页(堆、栈)没有磁盘后备,回收时必须写入 swap;文件页(page cache)若干净(未修改),可直接丢弃;若脏,则需先回写磁盘

内存回收触发:三个水位线(WMARK_MIN/WMARK_LOW/WMARK_HIGH)怎么管事

内核为每个内存 zone 维护三条水位线,它们不是固定值,而是随系统总内存动态计算:WMARK_MIN 是底线,低于它就触发同步的直接回收(direct reclaim),当前进程会被卡住;WMARK_LOW 是警戒线,唤醒 kswapd 后台线程开始异步回收;WMARK_HIGH 是目标线,kswapd 回收到这里就停手。

常见误解是“swap 开了就没事”,其实只要空闲页跌破 WMARK_MIN,哪怕 swap 还有空间,也会先卡住进程做 direct reclaim——因为换入换出太慢,内核宁可阻塞也要抢出几页。

  • 可通过 cat /proc/zoneinfo | grep -A 10 "Node 0, zone.*Normal" 查看各 zone 实时水位
  • 调整 /proc/sys/vm/min_free_kbytes 可间接改变所有水位线(增大它会抬高 WMARK_MIN,让回收更早启动,但会减少可用内存)
  • 不要盲目调高 min_free_kbytes:在 64GB 内存机器上设成 2GB,等于凭空吃掉 3% 的内存,对容器密集场景尤其不友好

回收干了啥:LRU 链表 + 页面分类 + 不同策略

回收不是随机扫内存,而是按页面类型和活跃度分层处理:每个 zone 有两组 LRU 链表(Active/Inactive),再按页面性质拆成四类:anon_inactive(不活跃匿名页)、anon_activefile_inactivefile_active。回收优先从 anon_inactivefile_inactive 里取页。

Go语言(Golang)Linux版
Go语言(Golang)Linux版

Go语言(Golang)Linux版适合在 Linux 环境中部署 Go 编译工具链,支持服务端开发、微服务、网络程序、容器化项目和自动化工具开发。

下载

区别对待是因为:文件页可丢弃或回写,成本低;匿名页只能 swap 或压缩(如果启用了 zswap)。而 LRU 并非纯时间排序——内核会根据页面被访问频率(通过 pgrefillpgdeactivate 等计数器)动态升降页面在链表中的位置。

  • 脏文件页(file_dirty)必须先回写到磁盘才能回收,这会拖慢整个回收周期,也是 IO 尖峰的常见源头
  • zswap(内存压缩)默认不启用,需手动加载模块并配置 zswap.enabled=1;它把 anon_inactive 压缩后存在内存中,避免写 swap,但会增加 CPU 开销
  • 回收过程会跳过被 mlock() 锁住的页、内核线程页、以及某些驱动独占的 DMA 页——这些是回收黑名单

OOM 杀手不是第一道防线,而是最后兜底

当 direct reclaim 跑完一轮仍凑不够页,内核就判定为 Out-of-Memory,并启动 oom_killer。它不看 CPU 占用,只算每个进程实际占用的物理内存页数(RSS),再叠加 oom_score_adj 调整分——数值越高的进程越容易被杀。

注意:OOM 触发前,系统往往已出现明显症状:top%wa(IO wait)飙升、dmesg 打印 “Out of memory: Kill process ...”、/proc/meminfoInactive(anon) 持续接近零。这时再查进程 RSS 已经晚了,得倒推是谁长期霸占 anon_active 链表不释放。

  • ps aux --sort=-%mem | head -10 快速定位内存大户,但要注意 RSS 包含共享库,未必是真实“罪魁”
  • 真正有效的是 cat /proc/[pid]/smaps | awk '/^Pss:/ {sum+=$2} END {print sum}',它统计 PSS(Proportional Set Size),按共享比例折算后更准
  • 容器环境要特别注意:cgroup v1 的 memory limit 不触发 OOM Killer,而是直接 throttle 进程,表现为卡死无响应,而非被 kill

水位线、LRU 链表、回收路径、OOM 触发条件——这几层环环相扣,改错一个参数(比如只调 swappiness)解决不了根本问题;真正要调的,往往是应用自身的内存使用模式,比如避免长生命周期缓存无淘汰策略。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux 虚拟内存

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

2624

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

1623

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

1268

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

2588

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

2326

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

1613

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

1204

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

1375

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

208

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Apifox下载与安装手册
Apifox下载与安装手册

共0课时 | 0人学习

安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 125人学习