当前位置: 首页 > 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 的硬指标。

http://www.dtcms.com/a/145151.html

相关文章:

  • 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地址
  • 大模型应用开发自学笔记
  • 右起第2个LED灯的闪烁(STC89C52单片机)
  • 车载测试用例开发-如何平衡用例覆盖度和测试效率的方法论
  • SpringBoot Actuator健康检查:自定义HealthIndicator
  • MySQL完整版进阶及附录
  • Linux 420 find stat touch tree scp crontab
  • 【去哪儿网】登录滑块逆向算法AES加密分析(逆天滑块轨迹)
  • C++学习:六个月从基础到就业——内存管理:RAII原则
  • 【重走C++学习之路】14、多态
  • Oracle高级语法篇 - 用户与角色关系