Android OOM解析

目錄

概念

 避免方法

 減小對象的內存使用

內存對象的重複使用

 避免對象的內存泄漏

 內存使用策略優化


概念

Android OOM全稱Out Of Memory,即內存溢出。會發生這個現象的根本原因是由於Android系統爲了整個系統的內存控制,爲每一個應用程序都設置了一個最大內存閾值即Dalvik Heap Size,如果應用分配內存超過這個閾值時,便會發生OOM。

如果想知道某個應用的最大內存閾值,可以先獲取ActivityManager實例,再調用其getMemoryClass方法,返回單位爲MB

 避免方法

爲了避免發生OOM,根本措施便是控制內存的分配,儘可能減少不必要的內存使用。具體細分爲以下四個方面

減小對象的內存使用

內存對象的重複使用

避免對象的內存泄漏

內存使用策略優化

 減小對象的內存使用

  1. 使用更爲輕量級的數據結構,例如使用ArrayMap/SparseArray代替HashMap
  2. 避免在Android中使用枚舉enum
  3. 減小Bitmap對象的內存佔用,具體措施可以看這個減小Bitmap對象的內存佔用
  4. 儘可能使用更小的圖片

內存對象的重複使用

  1.  複用系統自帶的資源,例如字符串/顏色/圖片/動畫/樣式/簡單佈局等等,在符合需求的情況下直接引用這些自帶的資源,不僅可以減小應用本身APK的大小,還可以一定程度減小內存上的開銷

  2. 在listView以及GridView中注意ConvertView的重複利用,避免每次都需要調用findviewById。或者使用RecyclerView代替前面二者,因爲RecyclerView本身便存在Viewholder複用機制

  3. Bitmap對象的複用,由於Bitmap對內存負擔很大,所以儘可能的複用

  4. 避免在onDraw方法中創建對象,因爲該方法會被調用很多次

  5. 利用StringBuffer替換+

 避免對象的內存泄漏

  1. 使用LeakCanary開源控件監測內存泄漏情況
  2. 儘可能使用application context而不是activity context
  3. Bitmap對象的及時回收
  4. 監聽器的註冊與註銷,一般需要register的監聽器,都需要及時調用unregister去註銷
  5. webView的泄漏,由於webView本身的兼容性問題,最好爲webView單獨開啓一個進程,使用AIDL與主進程進行通信,並及時銷燬WebView所在的進程
  6. Cursor對象的及時關閉

 內存使用策略優化

  1. 針對某些大內存的操作使用try catch捕獲並進行降級的內存分配
  2. 謹慎使用static關鍵字
  3. 儘可能減小布局層次,多層佈局不僅佔用內存更高,並且效率也會更低,所以儘可能減少佈局層次,業務需要的情況下可以採用自定義View
  4. 不要採用沒必要的抽象編程方式,抽象類本身就是一個額外的內存消耗,當它對性能提升沒有太大作用時,就避免採用這種編程方式
  5. 儘可能使用IntentService,它會在任務結束之後儘快結束自己內存消耗
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章