Android內存泄漏緣由

這段時間調試APP的時候,發現程序在加載了過多的bitmap後會崩潰。查看了日誌,原來是發生了內存溢出(OOM)。第一次遇到這樣的問題,那就慢慢排查吧。html

內存優化能夠參考胡凱大神的博客Android內存優化之OOMandroid

內存泄漏的緣由在Android 內存泄漏總結裏介紹的很詳細了,主要有如下幾個方面git

  • 集合類泄漏
  • 單例形成的內存泄漏
  • 匿名內部類/非靜態內部類和異步線程
  • Handler 形成的內存泄漏
  • 儘可能避免使用 static 成員變量
  • 避免 override finalize()
  • 資源未關閉形成的內存泄漏
  • 一些不良代碼形成的內存壓力

而內存泄露的分析工具,在這篇文章裏也介紹了不少,好比MAT(Memory Analysis Tools)。可是最方便的仍是LeakCanarygithub

關於LeakCanary的使用方法,能夠參考使用LeakCanary檢測安卓中的內存泄漏(實戰)。只須要在Gradle裏集成,在application裏初始化就好了。注意Gradle引用時是區分release和debug版本的。性能優化

集成後發現,原來是AsyncTask的不正確使用致使了內存泄漏,主要就是由於開發者文檔裏面用的就是用非靜態內部類,這個非靜態內部類會隱式地持有外部類的引用,若是其生命週期大於外部activity的生命週期,就有可能致使內存泄漏。app

解決方法能夠參考如下博客Android內存泄漏-AsyncTask的不正確使用Android內存泄露之ThreadAndroid性能優化之常見的內存泄漏。在內部內中,對外部的activity作一個弱引用,固然在Activity銷燬時候也應該取消相應的任務AsyncTask::cancel(),避免任務在後臺執行浪費資源.異步

相關文章
相關標籤/搜索