【轉載】不再糾結:從程序員的角度解讀蘋果爲什麼堅持使用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以上”這個觀點,只不過把真後臺改成了“多任務並行”這種方式。當然,如果有不同意見的話,歡迎回帖留言,我一個人的力量畢竟是有限的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章