Android記憶體回收機制,android回收機制
退出但不關閉:
這是Android對於Linux的最佳化。當 Android 應用程式退出時,並不清理其所佔用的記憶體,Linux 核心進程也相應的繼續存在,所謂“退出但不關閉”。從而使得使用者調用程式時能夠在第一時間得到響應。
應用程式切換到後台是暫停,完全不耗cpu和電量,只保留了運行狀態。如果app需要幕後處理事務(放音樂),那麼app進程會開啟相應的服務,所以在後台有消耗的只有服務。
佔用CPU的應用才耗電,背景只佔記憶體,所以是不耗電的。
預設回收機制:
當系統記憶體不足時,系統將啟用記憶體回收過程。為了不因記憶體回收影響使用者體驗(如殺死當前的活動進程),
回收優先順序:
Android 基於進程中啟動並執行組件及其狀態規定了預設的五個回收優先順序:
IMPORTANCE_FOREGROUND:前台進程,目前正在螢幕上顯示的進程和一些系統進程。
IMPORTANCE_VISIBLE:可見進程,可見進程是一些不再前台,但使用者依然可見的進程,比如IME、天氣、時鐘等。
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的閾值