当前位置: 首页 > 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.xdnf.cn/news/44209.html

相关文章:

  • 【Flutter】使用LiveKit和Flutter构建实时视频聊天应用
  • Linux操作系统--进程的创建和终止
  • java面试篇(常见的集合底层原理)
  • 中国占全球工业机器人装机量的52%,国产机器人崛起加速洗牌,拆分机器人业务独立上市,软硬件协同增强,AI工业机械臂催生业务再增长
  • Opencv图像处理:轮廓检测、轮廓近似、绘制外接圆外接矩形
  • Linux学习——TCP
  • Viper配置管理笔记
  • 基于springboot+vue的仓库管理系统
  • AI日报 - 2025年04月19日
  • 《Operating System Concepts》阅读笔记:p748-p748
  • C# 类型、存储和变量(用户定义类型)
  • python pdf转图片再OCR
  • WebSocket启用备忘
  • 【C++】类和对象之日期类的实现(构造、运算符重载)
  • Deepseek输出的内容如何直接转化为word文件?
  • PFLM: Privacy-preserving federated learning with membership proof证明阅读
  • mysql中的group by用法详解
  • 大模型安全吗?数据泄露与AI伦理的黑暗面!
  • 【数据结构_12】二叉树(4)
  • redis 中的 String 数据结构
  • 【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)
  • 【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的
  • 【人工智能】推荐开源企业级OCR大模型InternVL3
  • 【后端开发】MyBatis
  • 树莓派系统中设置固定 IP
  • Oracle 23ai Vector Search 系列之6 向量相似性搜索(Similarity Search)
  • 力扣DAY60-61 | 热100 | 回溯:单词搜索、分割回文串
  • 17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--SonarQube部署与配置
  • kotlin知识体系(六) : Flow核心概念与与操作符指南
  • opencv图像库编程