天天看點

Android高性能編碼實戰:修複記憶體洩漏

之前的文章從理論上介紹了Android高性能編碼的幾個優化的方向,下面我們從實戰的角度講述如何優化

Android高性能編碼實戰:App啟動優化

Android高性能編碼實戰:網絡架構優化

Android高性能編碼實戰:修複記憶體洩漏

        記憶體洩漏也稱作“存儲滲漏”,用動态儲存配置設定函數動态開辟的空間,在使用完畢後未釋放,結果導緻一直占據該記憶體單元。直到程式結束。(其實說白了就是該記憶體空間使用完畢之後未回收)即所謂記憶體洩漏。

移動裝置記憶體稀缺珍貴,而Android配置設定給虛拟機的記憶體也有限,是以防止記憶體洩漏是性能優化的重點,記憶體洩漏在Android開發中主要發生在activity或者fragment生命周期結束時,該回收的記憶體沒有回收。需要特别注意的有以下幾個地方:

1.和activity生命周期有關的控件,比如handler、AsyncTask,以及需要activity context的控件

handler等控件需要進行異步操作,由于一般是内部類的原因,會持有外部環境的引用,也就是activity的引用,這個時候activity生命周期結束了,由于還存在引用,釋放不掉,如果handler一直不釋放,activity也就不會回收,造成記憶體洩漏。

2.超大圖檔、圖檔相關的緩存架構

超大圖檔,圖檔大小超過8M的大圖檔,需要進行壓縮,ARGB8888改RGB565等操作之後使用,不然會直接造成OOM。

下載下傳圖檔并生成bitmap,一定要做好緩存,釋放bitmap和對應的ImageView,采用第三方圖檔緩存架構進行記憶體管理。

3.activity橫豎屏切換、語言切換

橫豎屏切換、語言切換等操作,activity會重新加載,

android:configChanges="keyboardHidden|orientation|screenSize"
           

在manifest activity标簽中添加,可以防止activity重新建立。

下面介紹一個檢查記憶體洩漏的工具

1.Android studio 自帶monitors

Android高性能編碼實戰:修複記憶體洩漏

一般大的記憶體洩漏直接觀察Allocated的大小就能發現

2.開源工具LeakCanary

LeakCanary是square的開源項目,定位記憶體洩漏神器,配置很簡單

在gradle中配置

dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
   testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
 }      

在Application中配置

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    if (LeakCanary.isInAnalyzerProcess(this)) {
      // This process is dedicated to LeakCanary for heap analysis.
      // You should not init your app in this process.
      return;
    }
    LeakCanary.install(this);
    // Normal app init code...
  }
}      

然後操作你的APP,每個頁面和功能都使用一遍,LeakCanary會自動檢查記憶體洩漏,生成記憶體洩漏報告

Android高性能編碼實戰:修複記憶體洩漏

LeakCanary可以發現很細微的記憶體洩漏,具體到類檔案,非常友善。

3.adb環境下輸入以下指令

adb shell dumpsys meminfo [應用包名]

這個指令可以檢查整個process程序的記憶體變化情況,不但可以檢查虛拟機的記憶體,還可以檢查native層的洩漏

Android高性能編碼實戰:修複記憶體洩漏