天天看點

Android記憶體回收機制

退出但不關閉:

  這是Android對于Linux的優化。當 Android 應用程式退出時,并不清理其所占用的記憶體,Linux 核心程序也相應的繼續存在,所謂“退出但不關閉”。進而使得使用者調用程式時能夠在第一時間得到響應。

  應用切換到背景是暫停的,完全不耗cpu和電量,隻保留了運作狀态。如果app需要背景處理事務(放音樂),那麼app程序會開啟相應的服務,是以在背景有消耗的隻有服務。

  占用CPU的應用才耗電,背景的隻占記憶體,是以是不耗電的。

預設回收機制:

  當系統記憶體不足時,系統将激活記憶體回收過程。為了不因記憶體回收影響使用者體驗(如殺死目前的活動程序),

回收優先級:

  Android 基于程序中運作的元件及其狀态規定了預設的五個回收優先級:

  IMPORTANCE_FOREGROUND:前台程序,目前正在螢幕上顯示的程序和一些系統程序。

  IMPORTANCE_VISIBLE:可見程序,可見程序是一些不再前台,但使用者依然可見的程序,比如輸入法、天氣、時鐘等。

  IMPORTANCE_SERVICE:服務程序,撥号、郵件存儲之類的。

  IMPORTANCE_BACKGROUND:背景程序,啟動後被切換到背景的程序。

  IMPORTANCE_EMPTY:沒有任何東西在内運作的程序,有些程式,比如BTE,在程式退出後,依然會在程序中駐留一個空程序,這個程序裡沒有任何資料在運作,作用往往是  提高該程式下次的啟動速度或者記錄程式的一些曆史資訊。

  home app:桌面程序,即launcher,保證在多任務切換之後,可以快速傳回到home界面而不需重新加載launcher。

  系統會對程序的重要性進行評估,并将重要性以“oom_adj”這個數值表示出來。前台程式的“oom_adj”值為0,這意味着它不會被系統終止。

  可根據“oom_adj”值的範圍來決定程序管理政策,比如可以設定“當記憶體小于X時,結束“oom_adj”大于Y的程序”。

Android記憶體回收機制

觸發記憶體回收的門檻值:

  進行記憶體排程有個閥值,隻有低于這個值系統才會按一個清單來關閉使用者不需要的東西。當然這個值預設設定得很小,是以你會看到記憶體老在很少的數值徘徊。

  為什麼記憶體少的時候運作大型程式會慢呢,原因是:在記憶體剩餘不多時打開大型程式時會觸發系統自身的調程序排程政策,這是十分消耗系統資源的操作,特别是在一個程式頻  繁向系統申請記憶體的時候。這種情況下系統并不會關閉所有打開的程序,而是選擇性關閉,頻繁的排程自然會拖慢系統。

APP虛拟機:

  安卓Android上的應用是java,當然需要虛拟機,而安卓Android上的應用是帶有獨立虛拟機的,也就是每開一個應用就會打開一個獨立的虛拟機.這樣設計的原因是可以避免虛拟機崩潰導緻整個系統崩潰,但代價就是需要更多記憶體。

Home鍵和傳回鍵:

  Home鍵用來多任務切換,傳回鍵相當于退出應用程式。

  按home退出,程式保留狀态為背景程序;按傳回鍵退出,程式保留狀态為空程序。

部分手機home鍵後程式重新開機:

  (1)修改manifast如下:

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:configchanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenorientation="landscape">

http://game.ceeger.com/forum/read.php?tid=9611&fid=2&page=1#115539

  (2)在背景開個服務

  http://bbs.9ria.com/thread-416715-1-1.html

  (3)有一種方法可以設定app永遠不會被kill,AndroidManifest.xml 中添加:

  android:persistent="true"

  這樣可使應用免受out-of-memory killer的影響

  适用于放在/system/app下的app。

  <application android:name="PhoneApp"

  android:label="@string/dialerIconLabel"

  android:icon="@drawable/ic_launcher_phone">

  ...

  </application>

  (4)設定runinbackground

  (5)QualitySettings.SetQualityLevel

  (6)是否能夠手動設定切換QQ登陸還是網頁模式登陸(記憶體過小時)

  (7)使用軟體MinFreeManager設定各類程序觸發OOM的門檻值