iOS 的内存管理和虚拟内存机制具体是怎么运作的?
众所周知,iOS 设备的内存普遍较小。但就最终用户体验而言,流畅舒服。想知道虚拟内存在其中是否发挥了作用?
3 条评论
分享
按投票排序
按时间排序
13 个回答
谢邀。
关于 iOS 的虚拟内存,最准确的信息是看官方文档: Memory Usage Performance Guidelines: About the Virtual Memory System。
简单来说,OS X 和 iOS 都有虚拟内存系统,但这里的虚拟内存和 Windows 中的虚拟内存是不一样的。
前者是指将物理内存地址,针对每个进程,映射到不同的虚拟内存地址上。于是在一个物理并不够大的设备上,32 位的进程也能使用 4 GB 的虚拟内存地址,64 位的进程能使用 18 EB 的虚拟内存地址。但在同一时间真正能使用内存量,仍然是设备的物理内存大小,虚拟内存并不会改变这个物理限制。它的作用就不详述了,感兴趣的可以去学计算机原理和操作系统,大概是大三的课程。
而后者指的是交换文件,即当进程使用的内存超过物理内存大小时,操作系统会将一部分暂时用不到的内存写入磁盘的交换文件,以腾出空间;当需要用到时,又会将交换文件中所需的部分读取到物理内存中。
OS X 是可以使用交换文件的,而 iOS 不行。
这是我在一台越狱的 iPhone 4 (iOS 6) 上执行的结果:
第 2 行表明 iOS 6 是没有使用交换文件的,最后一行表明目前所有进程的虚拟内存大小总量是 16 GB。
综上可以说明,iOS 系统是不使用交换文件的,也就谈不上对用户体验的作用。而虚拟内存只是操作系统管理内存的一种方式,也没有什么直接的影响(除了可以使用一些不连续的内存碎片等)。
最后我想说的是,苹果并没有什么黑科技能突破物理限制,至少从开放的源码中(Darwin)是看不出的。
iPhone 4S 相比 iPhone 4 多了一个核,所以在多线程下载时,对主线程的影响明显小了很多。
iPhone 5 相比 iPhone 4S 多了 512 MB 物理内存,所以在 iOS 7 上就流畅了很多。
更实际的体验是,iPhone 4 在使用 iOS 6 时,就已经很卡了,切应用时经常退出。
关于 iOS 的虚拟内存,最准确的信息是看官方文档: Memory Usage Performance Guidelines: About the Virtual Memory System。
简单来说,OS X 和 iOS 都有虚拟内存系统,但这里的虚拟内存和 Windows 中的虚拟内存是不一样的。
前者是指将物理内存地址,针对每个进程,映射到不同的虚拟内存地址上。于是在一个物理并不够大的设备上,32 位的进程也能使用 4 GB 的虚拟内存地址,64 位的进程能使用 18 EB 的虚拟内存地址。但在同一时间真正能使用内存量,仍然是设备的物理内存大小,虚拟内存并不会改变这个物理限制。它的作用就不详述了,感兴趣的可以去学计算机原理和操作系统,大概是大三的课程。
而后者指的是交换文件,即当进程使用的内存超过物理内存大小时,操作系统会将一部分暂时用不到的内存写入磁盘的交换文件,以腾出空间;当需要用到时,又会将交换文件中所需的部分读取到物理内存中。
OS X 是可以使用交换文件的,而 iOS 不行。
这是我在一台越狱的 iPhone 4 (iOS 6) 上执行的结果:
# sysctl vm.swapusage
vm.swapusage: total = 0.00M used = 0.00M free = 0.00M
# top
Processes: 53 total, 2 running, 51 sleeping... 303 threads
Load Avg: 0.15, 0.15, 0.17 CPU usage: 20.39% user, 0.00% sys, 79.61% idle
SharedLibs: num = 0, resident = 0 code, 0 data, 0 linkedit.
MemRegions: num = 0, resident = 0 + 0 private, 0 shared.
PhysMem: 67M wired, 53M active, 21M inactive, 414M used, 91M free.
VM: 16G + 0 384212(0) pageins, 3575(0) pageouts
综上可以说明,iOS 系统是不使用交换文件的,也就谈不上对用户体验的作用。而虚拟内存只是操作系统管理内存的一种方式,也没有什么直接的影响(除了可以使用一些不连续的内存碎片等)。
最后我想说的是,苹果并没有什么黑科技能突破物理限制,至少从开放的源码中(Darwin)是看不出的。
iPhone 4S 相比 iPhone 4 多了一个核,所以在多线程下载时,对主线程的影响明显小了很多。
iPhone 5 相比 iPhone 4S 多了 512 MB 物理内存,所以在 iOS 7 上就流畅了很多。
更实际的体验是,iPhone 4 在使用 iOS 6 时,就已经很卡了,切应用时经常退出。
1、iOS设备普遍内存比较小是真,但是谁告诉你小内存也流畅舒服了?512MB内存的iOS设备配合iOS8已经让人处于摔平板摔手机的边缘了好么。重载狂魔iPad Mini2罪魁祸首也是仅有1GB的内存。
2、如其他诸位所言,iOS有虚拟内存地址,但是没有虚拟内存没有分页文件。本身分页文件性能比物理内存性能差得多,再加上性能孱弱的手机储存,就算有的话也会非常卡顿。
3、无论是Android、iOS还是WP都没有虚拟内存,程序只能运行在物理内存允许的范围内。进程的内存占用有优先级之分,内存接近饱和之后会结束优先级低的进程。如果前台程序内存占用依然增加超过最大容许的大小,就会发生闪退。
4、Android与iOS和WP不同的一点是Android允许程序自己注册服务,就是说Android后台进程会比iOS更多一些。有些后台进程有可能占用比较多系统资源。需要注意的是,Android跟其它系统一样也只存在一个正在运行的程序,能后台运行的是服务。
5、Android不如iOS流畅有很多原因,比如垃圾回收会造成数十毫秒的卡顿、Dalvik虚拟机、高分辨率、显卡硬件性能低,但是这不表示iOS不需要大内存。性能类似的iOS设备,大内存体验肯定比小内存要好,参考iPad1与iPhone4迥异的命运。类似的还有WP,记得512MB内存的WP8设备单个程序只能占用150MB内存,1GB的可以申请额外内存最大到350MB,不知道WP8.1有没有改设定。
2、如其他诸位所言,iOS有虚拟内存地址,但是没有虚拟内存没有分页文件。本身分页文件性能比物理内存性能差得多,再加上性能孱弱的手机储存,就算有的话也会非常卡顿。
3、无论是Android、iOS还是WP都没有虚拟内存,程序只能运行在物理内存允许的范围内。进程的内存占用有优先级之分,内存接近饱和之后会结束优先级低的进程。如果前台程序内存占用依然增加超过最大容许的大小,就会发生闪退。
4、Android与iOS和WP不同的一点是Android允许程序自己注册服务,就是说Android后台进程会比iOS更多一些。有些后台进程有可能占用比较多系统资源。需要注意的是,Android跟其它系统一样也只存在一个正在运行的程序,能后台运行的是服务。
5、Android不如iOS流畅有很多原因,比如垃圾回收会造成数十毫秒的卡顿、Dalvik虚拟机、高分辨率、显卡硬件性能低,但是这不表示iOS不需要大内存。性能类似的iOS设备,大内存体验肯定比小内存要好,参考iPad1与iPhone4迥异的命运。类似的还有WP,记得512MB内存的WP8设备单个程序只能占用150MB内存,1GB的可以申请额外内存最大到350MB,不知道WP8.1有没有改设定。
iOS有虚拟内存地址,但是没有虚拟内存。内存不够了就开始强制清退不活动的app
由于有统一的推送服务,所以绝大多数app没有挂后台的理由,按home键切换走以后系统就将app完全挂起,并且根据使用频率排优先级,靠后的app先是被压缩,实在不够了就被清退
由于有统一的推送服务,所以绝大多数app没有挂后台的理由,按home键切换走以后系统就将app完全挂起,并且根据使用频率排优先级,靠后的app先是被压缩,实在不够了就被清退
Joseph Holy,程序员
杜鑫、Young Chen、孙方超 赞同
这问题问的。。。虚拟内存和流畅度没关系。他仅仅是一种方便程序员的机制,不用让程序员去关心太多硬件上的事情。分配内存和release内存的事情系统去处理。然后multi - task. iOS 4的时候,当你切换程序的时候,程序有两个状态,一个是Inactive, 一个是 Not Running。 Inactive 的状态就是把程序给缓存在内存里,NotRunning 就是直接给关了,这也为啥当你开一些很久不用的App 程序会重新启动,同理当你去看之前的网页,会reload一下。 至于流畅度我觉得主要原因是大家主要针对一个平台的具体某几种iPhone去开发 App自然会有很多优化,自然会流畅。
知乎用户 赞同
跟虚拟内存没什么关系。iOS和 Windows Phone都是采用墓碑机制,所以就算内存很小也能流畅运行。简单说,就是可以理解为只存在一个正在运行的程序,其他的程序都停止运行了。so,只要单个应用所用内存小于1G或者512m,就能流畅运行。
虚拟内存大致可以划分为两类:
1.将进程占用的内存地址映射到RAM内其他位置。
2.将进程占用的内存地址映射到磁盘上面
ios大概是第一种 第二种应该没有 在ios4时代虚拟内存导致了系统不稳定之后就取消了
虚拟内存其实就是一个进程的仓库 暂时不用了丢在里面
1.将进程占用的内存地址映射到RAM内其他位置。
2.将进程占用的内存地址映射到磁盘上面
ios大概是第一种 第二种应该没有 在ios4时代虚拟内存导致了系统不稳定之后就取消了
虚拟内存其实就是一个进程的仓库 暂时不用了丢在里面
单词,░▒▓██代码
以下只是提出一点想法,和具体问题似乎没有太过关系,求叠!
***
楼上说得很清楚,我想从发展的观点说一下:
> 可以参考一下osX的发展过程,从单窗口到多窗口
> 从无后台服务到有后台服务
***
还有,每种iOs设备其当前应用可申请的内存数是有限的,具体数据可以参考百度上的数据,一般不超过总物理内存的三分之一。
***
楼上说得很清楚,我想从发展的观点说一下:
> 可以参考一下osX的发展过程,从单窗口到多窗口
> 从无后台服务到有后台服务
***
还有,每种iOs设备其当前应用可申请的内存数是有限的,具体数据可以参考百度上的数据,一般不超过总物理内存的三分之一。