为什么 iOS 不支持虚拟内存?

2024 年 1 月 30 日
 tsohgdivil

iPhone 那么小的内存,最近几个 iOS 更新以后杀后台现象越来越严重,有时候我后台挂个视频通话切到其他应用,都能把我视频通话给杀了。相机应用更是重量级,基本上进个相机可以把所有其他后台应用都杀掉。

MacBook 8G 尊享版好歹还能用 SSD 寿命换一下使用体验,为啥 iPhone 又不给大内存,也不支持虚拟内存呢?

6573 次点击
所在节点    Apple
48 条回复
jeesk
2024 年 1 月 30 日
被杀主要是优先级不高。
bkmi
2024 年 1 月 31 日
@beijing999923 细说一下面子工程?
shutongxinq
2024 年 1 月 31 日
@yyzh iPhone 现在为止还没用 qlc
ShadowPower
2024 年 1 月 31 日
@wanguorui123
两个问题:
如果内存足够用,以至于从未发生过缺页中断,那么耗电从何而来?
如果内存不够用,为什么重新启动应用比换页省电?
noahhhh
2024 年 1 月 31 日
iPadOS 支持 swap ,iOS 只有 zram 。
With Virtual Memory Swap, iPad storage can be used to expand the available memory for all apps, and delivers up to 16 gigabytes of memory for the most demanding apps, helping to make multitasking absolutely seamless.

https://www.apple.com/hk/en/newsroom/2022/10/ipados-16-is-available-today/
noahhhh
2024 年 1 月 31 日
我是觉得手机上 swap 是没什么意义,大部分手机都是在内存不够用前处理器就该淘汰了。唯独苹果设备比较奇葩,苹果设备高 U 低内存的配置,
noahhhh
2024 年 1 月 31 日
@noahhhh 手滑。swap 增加的额外耗电和性能损耗非常不划算,影响用户体验,内存大一点对成本也没什么影响。只是 iOS 设备刚发布时候内存就是将将够用的状态,发布会大吹特吹的 3A 游戏如果画质稍高点就会因为内存不足而闪退,现在流行的原神和星铁在 4G 内存设备上也是会闪退。与其问为什么不支持 swap 不如骂内存扣扣搜搜。
wanguorui123
2024 年 1 月 31 日
@ShadowPower Mac 和 iPad 正常内存不够时才会大量使用 swap ,平时非常冷的数据也会用 Swap 作为冷内存使用,你要明白 Swap 只能作为应急(紧急)内存而不是常驻活动内存,因为频繁使用 Swap 非常影响性能导致系统卡顿,手机上频繁调用硬盘 Swap 比较费电,看看 iPhone 的电池容量就知道了 iPhone 的电池容量相对都很小,iOS 应用切换到后台休眠时也没有完全 Swap 掉这部分休眠 App 的内存到硬盘而是保留在内存,导致低内存 iPhone 一开相机就杀掉,其实也是为了省电和减少电池容量,其实 iOS 提供一套后台恢复机制保证用户体验但是国内的 App 大部分都没采用。
wanguorui123
2024 年 1 月 31 日
@ShadowPower Android 手机就不一样了,力大砖飞,内存不够就加到 24G ,电池不够就加到 5000mA ,如果还是耗电就强制 App 休眠对齐唤醒,推送也耗电那就统一推送服务
ShadowPower
2024 年 1 月 31 日
@wanguorui123 不是 Swap 不耗电,只是凡事都需要对比,哪种方案更耗电。

如果内存不足以维持前台应用正常运行,那么其实已经完全没法用了,就像当年 iPhone 6 玩王者荣耀结算界面闪退,iPhone 8 玩原神玩一半闪退( 1.0 版本还不给玩,1.1 给了)
这是更糟糕的用户体验……

这时候如果有 Swap 可以用,至少能维持应用正常运行。

如果只是用来存储后台应用,那么,内存不足的场景下(充足的时候就没有区别了),如果有 Swap ,应用的内存会存储到 SSD 里,如果没有,应用就会被杀掉。

有 Swap 的时候,当你切换回这个应用,系统只需要从硬盘里读取数据到内存中,然后一切状态都恢复了。程序本身不需要做任何初始化工作,约等于给所有应用都适配了状态恢复。

如果没有 Swap ,考虑当下现实情况,比如你切换到微信,却发现还需要看地球。
这时候应用还要额外做初始化工作,加载本地存储的持久化数据,创建各种对象,生成界面元素等等。此过程不但需要从硬盘读取数据,还需要做不少计算。完毕之后,用户还要操作 APP ,点开之前使用的界面。
耗电只会比有 Swap 的情况更多。

还有,你所谓的后台恢复机制,实际上也许和你想象中有出入。如果你想象中就像 Swap 那种样子,应用的内存全部保存起来,下次打开就会读取,那它还真不是这样。
iOS 6 之前没有这个东西,不过有墓碑机制。iOS 6 之后有个 UI 状态读取和恢复的 API ,但是其他应用数据都要自己保存。
后来苹果还改过这套 API 。后面我不做 iOS 开发了,不太熟悉……

其实并不是那种“整个 APP 数据完整保存下来”的机制。

只不过它可以缩短初始化的流程,能用之前的数据直接去创建应用界面和各种对象,还能让用户省去打开之前使用的界面的操作。让用户感觉“一点开应用就接着上次没看完,没用完的地方继续操作”,就像现在的 VSCode 、JetBrains IDE 那样。


最后,在 Android 上开启和关闭这玩意很简单,虽然代码实现不太一样,但是目的基本一样。我并没有发现它会造成可感知的续航缩短。比如开启之前我能用一天半,开了之后只能勉强用一天。实际上没这个现象。
wanguorui123
2024 年 1 月 31 日
@ShadowPower 切换到后台后应用整体 Swap 缓存下来意义不大,如果用户频繁切换应用,卡顿感非常明显,不如重新加载,至少用户感觉 App 在动,就像开车一样,车子在动总比堵车感受要好点
wanguorui123
2024 年 1 月 31 日
@ShadowPower 像微信/美团这种体量 App ,如果内存要 Swap 4G 以上,Swap 恢复估计要 7-8 秒吧,主屏卡顿无法操作 7-8 秒,用户肯定忍受不了,而低内存占用的 App 可以做 Swap 估计 1-3 秒就恢复现场,但是 Apple 并没有针对性的优化,可能 Apple 觉得这部分 App 不如重新加载来的快
ShadowPower
2024 年 1 月 31 日
@wanguorui123 不会有那么夸张,原神占用的内存大小都没有 4GB……
如果 APP 真的占用了 4GB ,当前任务所需要的活跃内存也不会达到 4GB 。

还有大多数程序内存数据,除非是图片、音频等资源,其实都很容易压缩。其实可以设计成两级,先进入内存压缩,再进入闪存。

对于难压缩的数据(可以试着压缩开头的一小块,算一下压缩率)可以直接进闪存。

实际上不用等待 7~8 秒。如果真的要那么久,往往应用从头加载也会那么久……
SenLief
2024 年 1 月 31 日
请直接购买 pro max 并每年一更新手机。
GPT9
2024 年 1 月 31 日
@Worldispow 笑死,一楼 CPU 烧了。
wanguorui123
2024 年 1 月 31 日
@ShadowPower 即便是 2G 占用也很花时间而且部分是内存泄露这么大的,其次内存是碎片化的读取到硬盘和重新恢复到内存都花时间和电量,远远没你想的那么简单,操作系统一次恢复这么大的内存也是负担
ShadowPower
2024 年 1 月 31 日
@wanguorui123 内存泄漏的部分其实永远都只会在闪存里,平时看起来就像普通的文件一样。

既然是泄漏的内存,那就是程序没有办法访问或者有办法但代码逻辑里却不用的。
不读写这块内存,就不会发生缺页中断,不会发生换页操作。

我没有说换页不需要时间和电量,但是禁用 Swap 把应用杀了只会花费更多的时间(包括展示广告、用户操作的时间)和电量。

如果用户体验真的更好,这个帖子就不会存在了。
ShadowPower
2024 年 1 月 31 日
@wanguorui123 内存碎片也不会延长 Swap 的时间,那些不能利用的内存空间实际上也不会访问到,不访问的页面都不会触发 Swap 。

只考虑当前的问题时,和内存泄漏可以一块讨论,它们都只是看起来大(向系统申请的内存多,用任务管理器看着大),实际用的小而已。

当前任务真正用的那部分实际有多大,才决定对性能的影响有多大。
iOCZS
2024 年 1 月 31 日
iOS 上没有 Swap 机制.(1.移动设配的闪存容量有限 2.闪存的写次数有限,频繁写会降低寿命)
当然目前 1 已经不是什么大问题了,想当年 8g,16g 的确膈应人
geeksammao
2024 年 1 月 31 日
@ShadowPower 其实你应该问的是为什么两大移动端 OS 在设计之初都没考虑采用 swap 机制,而且到了今天也只有个别国产厂商开始采用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1012768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX