Android性能優化之內存優化

需要知道的一些

  1. Android內存管理是paging分頁和memory-mapping內存映射技術(通過映射將二級存儲的相關文件關聯),沒有使用虛擬內存技術,可用內存數量完全取決於RAM。
  2. ART相對於Dalvik,減少了垃圾回收的步驟,爲位圖對象Bitmap添加了一個特殊的內存塊。
  3. ART虛擬機的AOT提前編譯在Android N時候添加了JIT及時編譯,用於在應用程序執行期間,它僅僅是用於補充AOT的功能。
  4. 內存抖動一般發生在短時間內大量創建新對象和GC對象。

優化

  1. 數據類型的選用,按需求控制基本類型的使用,減少內存和CPU計算
byte:8bit
char:16bit
float:32bit
double:64bit
short:16bit
int:32bit
long:64bit
  1. 避免使用包裝類型,以減少自動裝箱。比如Integer類和int類型
  2. 1000個以內數據時,用Android優化過的的SparseArray代替平時使用的HashMap

    • SparseArray避免了key和value的自動裝箱,它使用的內存區域是連續的(比如HashMap可能10個桶,只有6個桶存了數據),減少內存浪費。
    • SparseArray由2個數組組成,假如容量數量太大,二分查找將會不及hash查找快速
  3. 優先使用ArrayMap代替HashMap,它是SparseArray和HashMap的折中方案,可以使用對象作爲Map的key。

  4. 優化循壞,正常情況下,增強型for循壞>for循壞>While循壞>Iterator循壞,循壞時候的length注意,不要每次循壞都計算數組或者別的什麼數據結構的長度,應該單獨抽取計算。
  5. 避免使用枚舉,用靜態常量或者註解來代替
  6. 靜態常量static和static final是兩回事,推薦使用static final,以充分節約內存。JVM優化情況是static final類型的會存在與DEX文件中而不是被初始化在內存中(以空間換時間)。減少內存使用。
  7. 儘量減少創建臨時對象,因爲他們會頻繁觸發GC。
  8. 字符串使用StringBuilder來拼接。不要用String str = "ab"; str += "bc"這種方式。
  9. 重複使用的對象應該設置爲全局對象。假設它是方法內部的對象,每次執行每次分配內存,直到垃圾收集器到達回收上限纔會被回收。
  10. 輸入流(標記爲is)輸出流(標記爲os)釋放的時候,要分別獨立在各自的try catch語句中關閉。以避免由於is假如拋出異常時,os不能正常關閉。
  11. 使用對象池重用對象,借鑑線程池的手段。
  12. Activity的Context慎用,優化方法一般是使用Application的Context。
  13. 避免在Activity中使用靜態常量
  14. 使用弱引用和靜態內部類來處理Activity中使用耗時任務的情況(比如定時任務的AsyncTask)
  15. 同上, 弱引用來持有一個線程/定時的Handler
  16. 使用IntentService來代替Service,因爲它能自動停止。
  17. 使用HandlerThread或者線程池來啓動線程,HandlerThread通過Looper能通過消息來多次重複使用該線程減少開支。
  18. 使用四大組件和Fragment,Application實現的 ComponentCallback2接口的onTrimMemory()方法在監聽到內存的各種臨界值時,需要處理的邏輯,比如清楚緩存,釋放堆對象等。(當然還有ComponentCallback接口的onLowMemory方法,但是onTrimMemory()提供了更多的參數,推薦使用)
  19. 不要在menifest文件中添加LargeHeap屬性來提高堆空間,太大會影響垃圾回收的時間。會使UI延遲卡頓。

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章