0

0

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

舞夢輝影

舞夢輝影

发布时间:2026-01-26 18:51:31

|

817人浏览过

|

来源于php中文网

原创

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 里取页。

绘蛙AI商品图
绘蛙AI商品图

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载

区别对待是因为:文件页可丢弃或回写,成本低;匿名页只能 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)解决不了根本问题;真正要调的,往往是应用自身的内存使用模式,比如避免长生命周期缓存无淘汰策略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1373

2023.06.21

如何安装LINUX
如何安装LINUX

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

705

2023.06.29

linux find
linux find

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

295

2023.06.30

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

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

778

2023.07.05

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

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

575

2023.07.06

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

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

548

2023.07.20

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

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

300

2023.07.20

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

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

381

2023.07.25

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号