当前位置: 首页 > news >正文

Hello, Dirty page

什么叫“脏页”?

脏页(dirty page)= 内容已被进程修改过的物理页
当一块虚拟页第一次被载入 RAM 时,它要么来自某个文件(Mach‑O 代码、PNG 资源等),要么是匿名零页(堆、栈、BSS)。此时它是 干净页 (clean)——磁盘里已有一份等价拷贝或可以重新生成。CPU 对该页发生任何写操作 时,MMU 会把页表里的 dirty 位设为 1,表示「RAM 版本已不同于后备存储」。这就是“脏”。citeturn4view0


两种最常见的脏页来源
区域变脏的典型场景结果
匿名页(堆 / 栈 / malloc 区)首次写入对象、数组、临时变量页内数据只存在于 RAM;除非压缩或杀进程,否则系统无法回收
可写映射文件(Core Data WAL、缓存数据库等)进程经 mmap(PROT_WRITE) 更新文件页面最终会在 msync() 或文件关闭时写回闪存

只读代码、图片、字符串常量等 file‑backed + 只读 段几乎永远保持 clean;它们在内存压力下可直接丢弃,下次缺页时再从闪存重读。


为什么要区分“脏/干净”?
内核决策Clean 页Dirty 页
内存回收直接标记未驻留即可iOS 没有 swap:
• 若是匿名页→只能尝试压缩;
• 压缩池也满时→进入 Jetsam 淘汰进程
应用被挂起可整块清零,后台挂起体积很小必须留在 RAM;Dirty 太多 → 挂起时就被 Jetsam 杀掉
VMTracker/Instruments 统计计入 CleanReclaimable计入 Dirty;这部分才是真正无法随时释放的 “压力”

在 iOS 的 VM 模型里始终成立:

Resident ≥ Dirty

因为 Dirty 页一定常驻 RAM,而 Clean 页随时可被回收。随着你不断写入数据,Dirty 增长;当收到 Memory Warning 却仍不释放,系统压缩失败后就会 Jetsam 你的进程。citeturn4view0


开发者如何降低 Dirty 内存
  1. 及时释放:图片解码后不用就 nil 掉;大数组处理完立刻 free/reset。
  2. 用映射文件而非堆:大而少改的数据(例如离线地图瓦片索引)用 mmap(PROT_READ),让它保持 clean。
  3. 利用 NSData/IOSurfacepurgeable 属性:可声明为“可丢弃”,核心映射在压力大时变为 clean,被系统自动蒸发。
  4. 避免无谓写入:频繁把 JSON 解析为可变字典、在热路径上修改字符串都会制造额外 Dirty。

简单记住——写=脏,脏=难回收。在 Instruments 里盯住 Dirty Size,它才是真正决定你的 App 会不会被内存警告、会不会被 Jetsam 的硬指标。

相关文章:

  • LabVIEW发电机励磁系统远程诊断
  • P8512 [Ynoi Easy Round 2021] TEST_152 Solution
  • conda环境独立管理cudatoolkit
  • vulnhub five86系列靶机合集
  • HTTP:十.cookie机制
  • 2000-2017年各省城市液化石油气供气总量数据
  • 硬件工程师笔记——电子器件汇总大全
  • HTML — 总结
  • LeetCode[225]用队列实现栈
  • LeetCode 每日一题 2563. 统计公平数对的数目
  • WEMOS LOLIN32
  • python之计算平面曲线离散点的曲率
  • vivo把三颗「主摄」放进了手机
  • cpp知识章节
  • SpringAI系列 - MCP篇(一) - 什么是MCP
  • VitePress搭建-接入giscus的注意事项。
  • 第十章 继承与派生
  • PCL库开发入门
  • 【C++】win 10 / win 11:Dev-C++ 下载与安装
  • 域名解析,配置Linux系统的固定IP地址
  • 5月1日起,涉外婚姻登记将在上海市16区全面铺开
  • 北京顺义:做好潮白河大桥事故善后处置,举一反三排查风险
  • 从“龙队”到“龙副主席”,国乒这批退役球员为何不当教练了
  • 央行副行长陆磊:国际化程度有效提升是上海国际金融中心建设的一个主要方向
  • 神二十明日发射,长二F火箭推进剂加注工作已完成
  • 李公明|“小时光”与大时代中的地铁阅读者