Android 應用內存優化 之 onLowMemory & onTrimMemory


OnLowMemory:

  是Android提供的API,在系統內存不足,所有后台程序(優先級為background的進程,不是指后台運行的進程)都被殺死時,系統會調用OnLowMemory。
OnTrimMemory:

  是Android 4.0之后提供的API,系統會根據不同的內存狀態來回調。根據不同的內存狀態,來響應不同的內存釋放策略。

onTrimMemory傳入的幾個內存級別釋放內存:

    • TRIM_MEMORY_RUNNING_MODERATE
      你的應用正在運行,並且不會被殺死,但設備已經處於低內存狀態,並且開始殺死LRU緩存里的內存。
    • TRIM_MEMORY_RUNNING_LOW
      你的應用正在運行,並且不會被殺死,但設備處於內存更低的狀態,所以你應該釋放無用資源以提高系統性能(直接影響app性能)
    • TRIM_MEMORY_RUNNING_CRITICAL
      你的應用還在運行,但系統已經殺死了LRU緩存里的大多數進程,所以你應該在此時釋放所有非關鍵的資源。如果系統無法回收足夠的內存,它會清理掉所有LRU緩存,並且開始殺死之前優先保持的進程,像那些運行着service的。同時,當你的app進程當前被緩存,你可能會從onTrimMemory()收到下面的幾種level.
    • TRIM_MEMORY_BACKGROUND
      系統運行在低內存狀態,並且你的進程已經接近LRU列表的頂端(即將被清理).雖然你的app進程還沒有很高的被殺死風險,系統可能已經清理LRU里的進程,你應該釋放那些容易被恢復的資源,如此可以讓你的進程留在緩存里,並且當用戶回到app時快速恢復.
    • TRIM_MEMORY_MODERATE
      系統運行在低內存狀態,你的進程在LRU列表中間附近。如果系統變得內存緊張,可能會導致你的進程被殺死。
    • TRIM_MEMORY_COMPLETE
      系統運行在低內存狀態,如果系統沒有恢復內存,你的進程是首先被殺死的進程之一。你應該釋放所有不重要的資源來恢復你的app狀態。

狀態版本添加說明:

TRIM_MEMORY_COMPLETE:內存不足,並且該進程在后台進程列表最后一個,馬上就要被清理
TRIM_MEMORY_MODERATE:內存不足,並且該進程在后台進程列表的中部。
TRIM_MEMORY_BACKGROUND:內存不足,並且該進程是后台進程。
TRIM_MEMORY_UI_HIDDEN:內存不足,並且該進程的UI已經不可見了。 
以上4個是4.0增加
TRIM_MEMORY_RUNNING_CRITICAL:內存不足(后台進程不足3個),並且該進程優先級比較高,需要清理內存
TRIM_MEMORY_RUNNING_LOW:內存不足(后台進程不足5個),並且該進程優先級比較高,需要清理內存
TRIM_MEMORY_RUNNING_MODERATE:內存不足(后台進程超過5個),並且該進程優先級比較高,需要清理內存 
以上3個是4.1增加

onTrimMemory()是在API 14里添加的,你可以在老版本里使用onLowMemory()回調,大致跟TRIM_MEMORY_COMPLETE事件相同。

onLowMemory、 onTrimMemory優化,需要釋放什么資源?

在內存緊張的時候,會回調OnLowMemory/OnTrimMemory,需要在回調方法中編寫釋放資源的代碼。
可以在資源緊張的時候,釋放UI 使用的資源資:Bitmap、數組、控件資源。

注意回調時刻:

OnLowMemory被回調時,已經沒有后台進程;而onTrimMemory被回調時,還有后台進程。
OnLowMemory是在最后一個后台進程被殺時調用,一般情況是low memory killer 殺進程后觸發;而OnTrimMemory的觸發更頻繁,每次計算進程優先級時,只要滿足條件,都會觸發。

在Application、 Activity、Fragement、Service、ContentProvider中都可以重寫回調方法,對OnLowMemory/OnTrimMemory進行回調,在回調方法中實現資源釋放的實現。
以Activity為例,在Activity源碼中能夠看到對於onTrimMemory的定義,因此在回調的時候重寫方法即可。

優化:

用戶退出ui時,在Activity里實現onTrimMemory()回調,你應該在這個方法里監聽TRIM_MEMORY_UI_HIDDEN,它表示你的UI從視圖中隱藏了,你需要釋放只有UI使用的資源。

1 @Override
2     public void onTrimMemory(int level) {
3         super.onTrimMemory(level);
4         if (!getProcessName().equals(packageName)) {
5             return;
6         }
7 }

實現:

1. 聲明:

 1 public static class ViewComponentCallbacks implements ComponentCallbacks {
 2   @Override
 3   public void onConfigurationChanged(Configuration arg) {
 4   }
 5 
 6   @Override
 7   public void onLowMemory() {
 8     //釋放資源
 9     super.onLowMemory();
10   }
11 }

2. 注冊自定義的回調類:

1 HandlerMemoryCallbacks callBacks =new HandlerMemoryCallbacks();
2 this.registerComponentCallbacks( callBacks );

 

OnTrimMemory是Android在4.0之后加入的一個回調,任何實現了ComponentCallbacks2接口的類都可以重寫實現這個回調方法.OnTrimMemory的主要作用就是 指導應用程序在不同的情況下進行自身的內存釋放,以避免被系統直接殺掉,提高應用程序的用戶體驗.

 

參考:

Android開發:性能最佳實踐-管理應用內存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM