【转载】不再纠结:从程序员的角度解读苹果为什么坚持使用1G内存

转载自:http://bbs.feng.com/read-htm-tid-8305194.html 原作者:deathpain

文章开头更新一下,此篇文章并非为苹果洗地,个人观点苹果坚持使用1G内存的主要原因是成本控制和控制手机“强制报废”的年限,以及让下一代手机“更具有吸引力”。文章的目的是为了解释苹果为什么可以做到用如此低的配置能达到如此高的使用体验,让大家免于“纠结内存才1G”之苦。

再次更新下苹果使用1G内存但是不会卡的原因:Android 系统运行应用使用的是 Java 环境, 因此需要额外的内存来做垃圾回收 (garbage collection). 也就是当一个 Android 应用结束运行之后, Java 需要额外内存来回收该应用占去的内存. 一般来说, 在内存充裕的系统上, 这个机制运行得还不错. 一旦运行大批不同的应用, 问题就出现了. 以下表格显示, 一个 Android 应用理论上使用一份内存, 但是事实上却需要四份到八份的富余给 Java 去做回收, 系统才能够达到流畅. 开很多 Android 应用会卡卡卡卡卡, 就是这个原因.
这样我们就可以理解为什么 Android 机型要配置海量内存了, 因为更多内存消耗更多电力, 自然厂商也不得不增加电池容量, 来保证续航时间. 而 iOS 系统从设计开始, 就不是这样的垃圾回收机制, 而是应用要求多少就分配多少. 所以 Android 旗舰机型是人前风光宣传自己海量内存加大容量电池, 人后暗暗辛酸落泪.

首先声明一下,本人并非IOS程序员,不过本人的朋友正好在做IOS软件开发,并参与过多次开发者大会,此为背景。

虽然不是苹果死忠,但是本人对苹果产品也十分有兴趣,于是彻夜等待果6发布会,等到参数爆出来那一刻跟大家一样忍不住吐槽,尼玛都1080P了,为啥内存还是1G,这不要人命么!我把这话说给我朋友听,他立马就说IPHONE根本用不着2G内存,原因如下:

苹果给每个应用程序设置20M的内存警告量,30M的闪退量,游戏会略微放款10~20M,需要向系统申请。
这一条说明除了系统本身占用内存以外,任何程序几乎都不可能占用超过50M内存。←此句我着重解释一下,因为大家问题比较多,本来就是为了让更多纯小白玩家明白才这么写的。如果您完全不明白我说什么,无视红字即可。实际上,不是单个程序存在50M的内存使用上限,而是单线程使用上限是50M,同一个程序可以加载多个线程,同一个程序可以使用多个线程。剩下的我就不细说了。

关于后台,他是如下解释的:
苹果设计本身就没有后台,当你把程序最小化的时候程序就暂停了一切活动。如果应用想继续运行一部分功能的话,必须向系统申请运行时长,或者调用系统功能,比如音乐播放。由此跟安卓需要大内存来支持后台运行的区别就显而易见了,因为安卓是在Linux上跑的Java虚拟机,他的内存管理机制是申请之后就一直在那放着,等一个Runtime周期结束之后会自动收回不必要的内存。

关于大型软件退回到主页以后再次进入不是最小化,而是直接重启的原因,我本来认为是内存溢出导致程序崩溃,在闪退以后释放内存并重新加载导致的程序重启,不过我朋友不同意此观点,解释如下:
“大型游戏崩溃是因为绝大部分程序员是从Java转过来的,在进入背景的时候,有一个application Did Backgroung这么一个方法,他们会在这里进行想要的内存申请工作,以便达到他们期待的后台运行的目的,但是在applicationDidBecameActive的时候却没有把握好页面加载的时机,一次性把全部资源加载进内存导致超出系统允许范围,就崩溃了。”这句话结合本文第三段来看,确实很好的解释了为什么有的游戏会崩溃,尤其是多平台游戏,而苹果独占游戏几乎没有闪退的原因。

不知道上面的帖子对大家有没有帮助,简而言之的话,就是苹果只要不出真正的后台运行,它就基本上不会把内存提升到1G以上。当然或许也有可能是系统自身运行需要1G以上的话,苹果也是会推出大内存版的。

威锋首发,转载请注明出处

另外如果有任何问题,我可以代大家向我

看大家都云里雾里的,有的童鞋还说我给苹果洗地,我再简要的说明一下苹果为什么不用2G内存:
我朋友说,IOS只要不彻底重新编写的话,苹果几乎不可能开放海量内存,因为它既不支持真后台,又给APP设置了50M的内存使用上限。 为照顾小白用户我打个比方:你开法拉利(超大内存),我开QQ(1G内存),咱俩一起在路上跑(使用内存),但是限速50(内存使用限制),只要超过限速就扣车(超过限制即强行释放内存),你开再好的车也不可能比我快多少,因为苹果不让,除非苹果放开限速让你随便跑(开放内存配额上限)。但是不把路挖掉重新铺的话(系统限制,除非大刀阔斧的做改造,否则开放意义也不大,主要是苹果公司认为没意义……),就不能开放限速,所以现阶段只能限速50.这就是IPHONE只用1G内存的原因。

再补充一点个人见解,是回复中有人提醒我所想到的:伪后台也会造成系统长时间运行,增加其耗电量。苹果如果使用了大内存,并放开了伪后台使用限制的话,很可能随着使用时间的积累造成大量伪后台长期运行,最终导致耗电量直线增加,我想这也是苹果最终采取了这种一刀切做法的原因。我想大家宁愿看到程序闪退,也不愿意用待机5个小时揣兜里烫屁股的手机吧……这句话纯属个人吐槽,因为此问题是可以利用技术手段修正的,不过遇上流氓软件的话,后果你们懂。

在此更新一下后台进入所引发的程序重载问题。看懂上面红字解释的朋友继续看这里:由于有50M内存使用限制,所以很多大型软件几乎都是使用多次载入多线程的方法来达到增大可用内存的目的。这样做的话,因为首次载入的话是按照顺序载入的,一次一个线程,所以可以正常使用。但是如果此程序退出到后台的话,有可能在回到主程序的过程中发生所有内容一次性加载这种情况,也就是在“最大化”的过程中一次性加载进了所有的内存,造成系统判断此程序超过了内存允许使用的上线,于是强制释放内存造成闪退。

最后着重阐述一下不增大内存的实际原因:苹果公司不想加大内存,现阶段内存大小足够你日常使用不出大问题。其实很容易理解,苹果是个商业公司,不是慈善机构,只要它能保证做出的产品可以正常使用,那它的本职工作就已经完成了,大家不用纠结他到底用的什么配置,因为他不管用什么配置,2年以内苹果都会为你的手机保持更新,以保证你在能满足正常使用的条件下可以用到最新的程序功能,这就足够了。

更新:关于IPAD AIR2使用2G内存的事,本人是这么理解的:IPAD AIR2的IOS8和其他设备更新的IOS8略有不同,只有IPAD AIR2的IOS8有同屏多任务功能,也就是说,一个屏幕中可以同时运行两个或以上的程序,相当于开放了1个全功能后台,内存使用量翻倍,1G内存根本不可能胜任,所以必须升级的2G。如果是这样的话,正好印证了我文中所说的“苹果只要不出真正的后台运行,它就基本上不会把内存提升到1G以上”这个观点,只不过把真后台改成了“多任务并行”这种方式。当然,如果有不同意见的话,欢迎回帖留言,我一个人的力量毕竟是有限的

posted on 2016-02-05 21:16  JeremyGuo  阅读(246)  评论(0编辑  收藏  举报

导航