星期四, 1月 12, 2012

iOS需要關掉程式釋放memory

大部份的人都希望手機拿來用而不需要什麼背景知識,但很可惜地,隨著智慧型手機的普及,iOS/Android/WM 用起來比 Symbian 複雜太多,穩定性也更差。

前幾天某個Blog上寫說iOS device在Home鍵按兩下出現 App的列表只是「最近用過的應用程式」,並不會影響作業,完全不需要手動關,這是大錯特錯,完全的誤導呀!

早期iPhone推出時,並不具備多工,但隨著iOS 4推出具備(半?)多工後,事情變得麻煩。因為手機是記憶體受限裝置,iPhone 3GS才256MB,所以多工勢必要消耗更多的記憶體,開了幾十個App之後,很可能會因為作業系統所能支配的記憶體不足,出現速度遲緩或是程式當掉的情形;嚴重時必須重開才能釋放leak的memory。這件事只要用任何一套iOS上的memory monitor程式就可以證實,上個月敝公司的CEO的iPhone 4上Mail完全看不到附件,用這招才恢復正常。根據在下兩年來不專業的使用下,連耗電量都有很大的差異!


補充說明:列表並不代表占在記憶體裡的情形,但是會有關連,尤其是會背景執行的App,必須這樣關閉。在 iOS :認識多工處理 有提到:
Activity Monitor Touch這支程式來證實我的說法。
先做名詞解釋,參考A detailed look at memory usage in OS X,Active不用說,就是現用的 ; Free不必我解釋吧?Inactive 是 allocated memory that hasn't been accessed during last N Secs,也就是可以吐回的記憶體;Wired 是 memory allocated that shouldn't/can't be swapped/paged out ,也就是已配置也不能置換的記憶體。在Activity Monitor Touch用紅色代表Wired,黃色表示Active,白色是Free,藍色是Inactive。以下是測試:
  1. 亂開一堆App,結果快用完256MB:
  2. 先關有背景多工的App,可以看得到Wired memory馬上釋放:
  3. 接著關沒有背景多工的App:
  4. 最後可以看出,若如該篇文章所言,應該不會占用Wired memory,但事實上還是有差別:
剛才是我隨便開的,並沒有長期使用,有些App沒寫好,占住記憶體不放的情形就更明顯,明明不是多工程式,卻使用一堆Wired memory。

最後值得一提的是:iOS上memory leak其實還挺嚴重的,我的iPad一代常發生遊戲玩到某個地方就會當掉,必須關機重開才能繼續玩。希望以後的iOS能夠真的不用再去關背景程式,就suspend到flash上,除了升級OS外別再叫我重開機呀!(這叫做Apple MS化嗎?)

2 則留言:

89 提到...

「前幾天某個Blog上寫說iOS device在Home鍵按兩下出現 App的列表只是「最近用過的應用程式」,並不會影響作業,完全不需要手動關,這是大錯特錯,完全的誤導呀!」



你的結論才是誤導
事實上
背景的程式雖然佔用記憶體
但那只是為了「加速程式再開啟」速度而已
當前景程式需要記憶體
這些背景程式的記憶體會「立刻」被釋放

所以根本不需要手動關

鳥毅 提到...

89:
如果你像我一樣, 常用iPad 一代玩Game遇到記憶體不足跳出來,應該就不會這麼說了。我最近常需要把空間清出來才能啟動Rinth island,有興趣你也可以找台舊機試試。