1. 程式人生 > >Android內存回收機制

Android內存回收機制

dsc 一個 手機 min 輸入 and reg 系統資源 適用於

退出但不關閉:
  這是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的進程”。

技術分享圖片
觸發內存回收的閾值:
  進行內存調度有個閥值,只有低於這個值系統才會按一個列表來關閉用戶不需要的東西。當然這個值默認設置得很小,所以你會看到內存老在很少的數值徘徊。
  為什麽內存少的時候運行大型程序會慢呢,原因是:在內存剩余不多時打開大型程序時會觸發系統自身的調進程調度策略,這是十分消耗系統資源的操作,特別是在一個程序頻  繁向系統申請內存的時候。這種情況下系統並不會關閉所有打開的進程,而是選擇性關閉,頻繁的調度自然會拖慢系統。
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:persistent="true"
  android:label="@string/dialerIconLabel"
  android:icon="@drawable/ic_launcher_phone">
  ...
  </application>
  (4)設置runinbackground
  (5)QualitySettings.SetQualityLevel
  (6)是否能夠手動設置切換QQ登陸還是網頁模式登陸(內存過小時)
  (7)使用軟件MinFreeManager設定各類進程觸發OOM的閾值

Android內存回收機制