WWDC 2018 Session 416:iOS Memory Deep Dive
查看更多 WWDC 18 相关文章请前往 老司机x知识小集xSwiftGG WWDC 18 专题目录
作者:高老师,纯洁善良有理想的 iOS 开发一枚
引言
对于我们的 App 所依赖的设备而言,内存资源是有限的。降低 App 所使用的内存可以提高性能和体验,相反,过大的内存占用可能会导致 App 被系统强制退出。所以每个 iOS 开发者都应该关注内存问题。这一节新的内容不多,基本上都是一些老的知识点。
按照 Session 的套路,我们先看一下提纲:
- 为什么要减少内存使用
- 内存占用
- 分析内存占用工具
- 图像
- 在后台时,对内存优化
- 演示 Demo
那我们就按顺序开始啦!
为什么要减少内存
在探讨内存之前,我们要知道为什么要减少内存。简单的回答是可以有更好的用户体验:更快的启动速度,不会因为内存过大而导致 Crash,可以让 App 存活更久等。
内存占用
并非所有 App 的内存占用都是相同的。在继续探讨 iOS 上 App 的内存使用之前,我们先来聊一下Pages Memory
。
Pages Memory
内存是由系统管理,一般以页为单位来划分。在 iOS 上,每一页包含 16KB 的空间。一段数据可能会占用多页内存,所占用页总数乘以每页空间得到的就是这段数据使用的总内存。
内存页按照各自的分配和使用状态,可以被分为 Clean
和 Dirty
两类。
以上面的代码为例,申请一块长度为 80000 字节的内存空间,按照一页 16KB 来计算,就需要 6 页内存来存储。
- 当这些内存页开辟出来的时候,它们都是
Clean
的 - 当向处于第一页的内存写入数据时,第一页内存会变成
Dirty
- 当向处于最后一页的内存写入数据时,这一页也会变成
Dirty
内存映射文件
当 App 访问一个文件时,系统内核会负责调度,将磁盘上的文件加载并映射到内存中。如果这是只读的文件,它所占用到的内存页是 Clean
的。
如下图所示,一个 50KB 的图片被加载到内存中时,需要分配 4 页内存来存储。其中第四页中有 2KB 的空间会被用来存储这个图片的数据,剩余空间可能会被用来存储其它数据。
典型app内存类型
当内存不足的时候,系统会按照一定策略来腾出更多空间供使用,比较常见的做法是将一部分低优先级的数据挪到磁盘上,这个操作称为 Page Out
。之后当再次访问到这块数据的时候,系统会负责将它重新搬回内存空间中,这个操作称为 Page In
。
然而对于移动设备而言,频繁对磁盘进行IO操作会降低存储设备的寿命。从 iOS7 开始,系统开始采用压缩内存的办法来释放内存