深入解析iOS内存 iOS Memory Deep Dive

Session 416 由三位苹果软件工程师 Kyle Howarth, James Snee, Kris Markel 为我们带来 iOS 内存相关的一些内容

在 Memory Usage Performance Guidelines 不再更新之后,这个 Session 简单介绍了一下 iOS 的虚拟内存机制的变化,如 Compressed memory 的使用等,分析了开发者应该减少哪部分内存占用。

Xcode 10 现在可以捕获内存超限的 EXC_RESOURCE_EXCEPTION 事件,其底层记录内存信息的 memgraph 文件与命令行工具的结合使用,使得内存相关的调试更加灵活高效。

推荐开发者通过新的 API 让系统选择最佳的图片渲染格式来合理使用内存;相比于UIImage的绘制,图片下采样时使用ImageIO来减少损耗。

减少应用处在后台时较大的内存占用,主要通过监听 App 生命周期的通知或利用VC的生命周期方法实现,使系统或其他进程获得更多的可用内存。

1. Why Reduce Memory?

开门见山,我们为什么要减少内存(占用)?

为了更好的用户体验

内存是有限且系统共享的资源,一个程序占用更多,系统和其他程序所能用的就更少。程序启动前都需要先加载到内存中,并且在程序运行过程中的数据操作也需要占用一定的内存资源。减少内存占用也能同时减少其对 CPU 时间维度上的消耗,从而使不仅你所开发的 App,其他 App 以及整个系统也都能表现的更好。

2. Memory Footprint

我们需要明确的是,这里的减少内存指减少 iOS App 的虚拟内存(Virtual Memory) 占用。

iOS 以及 macOS 都采用了虚拟内存技术来突破物理内存(RAM) 的大小限制,每个进程都拥有一段由多个大小相同的 page 所构成的逻辑地址空间。处理器和内存管理单元 MMU(Memory Management Unit) 维护着由逻辑地址空间到物理地址的 page 映射表,当程序访问逻辑内存地址时由 MMU 根据映射表将逻辑地址转换为真实的物理地址。在早期的苹果设备中,每个 page 的大小为 4KB;基于 A7 和 A8 处理器的系统为 64 位程序提供了 16KB 的虚拟内存分页和 4KB 的物理内存分页;而在A9之后,虚拟内存和物理内存的分页大小都达到了 16KB。

虚拟内存分页(Virtual Page, VP) 有两种类型:

1.Clean - Data that can be paged out of memory

指的是能够被系统清理出内存且在需要时能重新加载的数据,包括:

Memory mapped files

Frameworks 中的 __DATA_CONST 部分

应用的二进制可执行文件

2.Dirty - Any memory that has been written to by your app

指的是不能被系统回收的内存占用,包括

所有堆上的对象

图片解码缓冲数据(Decoded image buffers)

Frameworks 中的 __DATA 和 __DATA_DIRTY部分

Frameworks you link actually use clean memory and dirty memory

由于闪存容量和读写寿命的限制,iOS 上没有Disk swap机制,取而代之使用 Compressed memory。

Disk swap 是指在 macOS 以及一些其他桌面操作系统中,当内存可用资源紧张时,系统将内存中的内容写入磁盘中的backing store (Swapping out),并且在需要访问时从磁盘中再读入 RAM (Swapping in)。与大多数 UNIX 系统不同的是,macOS 没有预先分配磁盘中的一部分作为 backing store,而是利用引导分区所有可用的磁盘空间。

苹果最初只是公开了从 OS X Mavericks 开始使用 Compressed memory 技术,但 iOS 系统也从 iOS 7 开始悄悄地使用。从 OS X Mavericks Core Technology Overview 文档中可以了解到该技术在内存紧张时能够将最近使用过的内存占用压缩至原有大小的一半以下,并且能够在需要时解压复用。它在节省内存的同时提高了系统的响应速度,其特点可以归结为:

Shrinks memory usage 减少了不活跃内存占用

Improves power efficiency 改善电源效率,通过压缩减少磁盘IO带来的损耗

Minimizes CPU usage 压缩/解压十分迅速,能够尽可能减少 CPU 的时间开销

Is multicore aware 支持多核操作

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值