Android內存泄漏分析及MAT工具使用

1.內存泄漏是什麼

  • 一句話概括:就是GC垃圾回收機制漏掉的垃圾對象,無法回收
  • 內存泄漏過多就會造成內存溢出

2.什麼是垃圾回收機制?

就是當對象不具備任何引用的時候,可被回收

3.GC ROOT Tracing 算法

  • 被GC Root 引用的對象不可被回收
  • 沒有被GC Root Obj所持有的對象可以被回收

4.可以作爲GC Root引用的點是(不被回收):

  • java stack中引用的對象
  • 方法區中靜態引用指向的對象
  • 方法去中常量引用指向的對象
  • Native方法中jni引用的對象
  • Thread—活着的線程

5.常見的內存泄漏案例:

參考QQ空間Android內存泄漏分析心得

  • 1:單例造成的內存泄漏

    • 解決方案
      • 將該屬性的引用方式改爲弱引用;
      • 如果傳入Context,使用ApplicationContext;
  • 2: InnerClass匿名內部類

    • 在Java中,非靜態內部類 和 匿名類 都會潛在的引用它們所屬的外部類,但是,靜態內部類卻不會。如果這個非靜態內部類實例做了一些耗時的操作,就會造成外圍對象不會被回收,從而導致內存泄漏。
    • 解決方案
      • 將內部類變成靜態內部類;
      • 如果有強引用Activity中的屬性,則將該屬性的引用方式改爲弱引用;
      • 在業務允許的情況下,當Activity執行onDestory時,結束這些耗時任務;
  • 3:Activity Context 的不正確使用

    • 在Android應用程序中通常可以使用兩種Context對象:Activity和Application。當類或方法需要Context對象的時候常見的做法是使用第一個作爲Context參數。這樣就意味着View對象對整個Activity保持引用,因此也就保持對Activty的所有的引用。
    • 解決方案
      • 使用ApplicationContext代替ActivityContext,因爲ApplicationContext會隨着應用程序的存在而存在,而不依賴於activity的生命週期;
      • 對Context的引用不要超過它本身的生命週期,慎重的對Context使用“static”關鍵字。Context裏如果有線程,一定要在onDestroy()裏及時停掉。
  • 4:Handler引起的內存泄漏

    • 當Handler中有延遲的的任務或是等待執行的任務隊列過長,由於消息持有對Handler的引用,而Handler又持有對其外部類的潛在引用,這條引用關係會一直保持到消息得到處理,而導致了Activity無法被垃圾回收器回收,而導致了內存泄露。
    • 解決方案
      • 可以把Handler類放在單獨的類文件中,或者使用靜態內部類便可以避免泄露;
      • 如果想在Handler內部去調用所在的Activity,那麼可以在handler內部使用弱引用的方式去指向所在Activity.使用Static + WeakReference的方式來達到斷開Handler與Activity之間存在引用關係的目的。
  • 5:註冊監聽器的泄漏

    • 解決方案
      • 使用ApplicationContext代替ActivityContext;
      • 在Activity執行onDestory時,調用反註冊;
  • 6:Cursor,Stream沒有close,View沒有recyle

  • 7:集合中對象沒清理造成的內存泄漏

    • 在Activity退出之前,將集合裏的東西clear,然後置爲null,再退出程序。
  • 8: WebView造成的泄露

    • 當我們不要使用WebView對象時,應該調用它的destory()函數來銷燬它,並釋放其佔用的內存,否則其佔用的內存長期也不能被回收,從而造成內存泄露。
  • 9:構造Adapter時,沒有使用緩存的ConvertView

6.使用AndroidStudio進行內存分析

步驟如下:

圖1:


圖2:


7.通過MAT工具進行分析

第一步:如下圖先導出標準的hprof文件。可以生成兩個hprof文件,通過MAT比較分析。


第二步:打開MAT工具,可以單獨下載這個插件下載

第三步:導入兩個hprof文件,根據下圖的步驟進行比較分析


第四步:按照下圖步驟選擇


最後:找到未釋放的引用


參考:
QQ空間Android內存泄漏分析心得

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