Android 記憶體洩露和效能檢測
Android Studio的記憶體分析介面
一般分析記憶體洩露, 首先執行程式,開啟日誌控制檯,有一個標籤Memory ,我們可以在這個介面分析當前程式使用的記憶體情況, 一目瞭然, 我們再也不需要苦苦的在logcat中尋找記憶體的日誌了。
圖中藍色區域,就是程式使用的記憶體, 灰色區域就是空閒記憶體
當然,Android記憶體分配機制是對每個應用程式逐步增加, 比如你程式當前使用30M記憶體, 系統可能會給你分配40M, 當前就有10M空閒, 如果程式使用了50M了,系統會緊接著給當前程式增加一部分,比如達到了80M, 當前你的空閒記憶體就是30M了。 當然,系統如果不能再給你分配額外的記憶體,程式自然就會OOM(記憶體溢位)了。 每個應用程式最高可以申請的記憶體和手機密切相關,比如我當前使用的華為Mate7,極限大概是200M,算比較高的了, 一般128M 就是極限了, 甚至有的手機只有可憐的16M或者32M,這樣的手機相對於記憶體溢位的概率非常大了。
我們怎麼檢測記憶體洩露呢
首先需要明白一個概念, 記憶體洩露就是指,本應該回收的記憶體,還駐留在記憶體中。一般情況下,高密度的手機,一個頁面大概就會消耗20M記憶體,如果發現退出介面,程式記憶體遲遲不降低的話,可能就發生了嚴重的記憶體洩露。我們可以反覆進入該介面,然後點選dump java heap 這個按鈕,然後Android Studio就開始幹活了,下面的圖就是正在dump
正在dump
dump成功後會自動開啟 hprof檔案,檔案以Snapshot+時間來命名
記憶體分析結果
通過Android Studio自帶的介面,檢視記憶體洩露還不是很智慧,我們可以藉助第三方工具,常見的工具就是MAT了,下載地址 http://eclipse.org/mat/downloads.php ,這裡我們需要下載獨立版的MAT. 下圖是MAT一開始開啟的介面, 這裡需要提醒大家的是,MAT並不會準確地告訴我們哪裡發生了記憶體洩漏,而是會提供一大堆的資料和線索,我們需要自己去分析這些資料來去判斷到底是不是真的發生了記憶體洩漏。
LeakCanary
上面介紹了MAT檢測記憶體洩露, 再給大家介紹LeakCanary。
專案地址:https://github.com/square/leakcanaryLeakCanary
會檢測應用的記憶體回收情況,如果發現有垃圾物件沒有被回收,就會去分析當前的記憶體快照,也就是上邊MAT用到的.hprof檔案,找到物件的引用鏈,並顯示在頁面上。這款外掛的好處就是,可以在手機端直接檢視記憶體洩露的地方,可以輔助我們檢測記憶體洩露.
手機端檢視記憶體洩露.png使用:
在build.gradle檔案中新增,不同的編譯使用不同的引用:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
在應用的Application onCreate方法中新增LeakCanary.install(this),如下:
public class ExampleApplication extends Application
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
應用執行起來後,LeakCanary會自動去分析當前的記憶體狀態,如果檢測到洩漏會發送到通知欄,點選通知欄就可以跳轉到具體的洩漏分析頁面。Tips:就目前使用的結果來看,絕大部分洩漏是由於使用單例模式hold住了Activity的引用,比如傳入了context或者將Activity作為listener設定了進去,所以在使用單例模式的時候要特別注意,還有在Activity生命週期結束的時候將一些自定義監聽器的Activity引用置空。
作者:於連林520wcf連結:https://www.jianshu.com/p/216b03c22bb8來源:簡書著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
是什麼?
一言以蔽之:LeakCanary是一個傻瓜化並且視覺化的記憶體洩露分析工具
為什麼需要LeakCanary?
因為它簡單,易於發現問題,人人可參與。
- 簡單:只需設定一段程式碼即可,開啟應用執行一下就能夠發現記憶體洩露。而MAT分析需要Heap Dump,獲取檔案,手動分析等多個步驟。
- 易於發現問題:在手機端即可檢視問題即引用關係,而MAT則需要你分析,找到Path To GC Roots等關係。
- 人人可參與:開發人員,測試測試,產品經理基本上只要會用App就有可能發現問題。而傳統的MAT方式,只有部分開發者才有精力和能力實施。
如何整合
儘量在app下的build.gradle中加入以下依賴
1 2 3 4 5 |
在Application中加入類似如下的程式碼
1 2 3 4 5 6 7 |
到這裡你就可以檢測到Activity的內容洩露了。其實現原理是設定Application的ActivityLifecycleCallbacks方法監控所有Activity的生命週期回撥。內部實現程式碼為
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |