ios系统如何分配内存?

付长兰付长兰最佳答案最佳答案

这问题有意思,之前都没人回答,我来冒个泡~ 最近正好在做关于内存优化的事情(因为老有同学问我),于是做了一堆实验来测试 iOS 的内存管理策略。 先说结论: 根据我们的测试,iOS 系统并不会对每个 App 使用到的内存进行动态监控和优化,它只会自动调用系统性能监控工具来记录整个系统的内存使用情况,并根据这些数据来决定是否要杀掉进程释放内存。

为了便于讨论,我们自制的这个简单网络协议栈的测试 App 只加入了 UDP 的支持,所以它的内存占用情况应该可以代表一些低复杂度网络栈的内存占用情况,比如蓝牙、WiFi等模块应该是类似的。 首先我们将一个只有 80K 大小的测试 app 反复运行,在每次运行过程中截取几次不同的内存状态,如下图: 可以看到,虽然每次内存占用都有差异,但是总的过程是稳定的上升并达到一个峰值,然后衰减到一定值后保持稳定。这就是应用在内存中动态增长的曲线。

然而,我们观察系统内存的时候发现,当内存不足时,系统会自动杀死某些无用的进程来释放内存,此时应用的内存占用应该会急剧下降,如下图所示: 可见,对于低复杂度的网络栈而言,它的内存消耗虽然是动态增加的,但增长的趋势是可以预测的,因此完全可以做到在需要的时候预先申请足够的内存,这样就能避免被系统 Kill 之后重新启动时的损失。

当然这种趋势性的增长肯定会受到多种因素影响,如线程数、连接数的变化等等,不过根据我们的测试,在正常使用时这些因素的影响都可以忽略不计。 如果考虑到设备性能的差异,64位的 iPhone 和 iPad 所拥有的大内存空间其实远大于 32 位设备,那么我们是不是可以通过提前预载入更多的内容来保证应用能在 64 位设备上稳定运行呢?经过简单的计算我们发现,在同样的使用场景下, 64 位系统比 32 位系统可以多加载约 50% 的内存。 另外需要说明的是,由于 iOS 系统不会主动清除已卸载的应用残留的垃圾,因此只要没有物理损坏,任何已经安装的应用都能被恢复。这点与 Android 是有区别的。

发表评论
请发表正能量的言论,文明评论!