怎麼才能檢測內存泄露呢?網上教程很是多,不過不少都是使用Eclipse檢測的, 其實1.3版本之後的Android Studio 檢測內存很是方便, 若是結合上MAT工具,LeakCanary插件,一切就變得so easy了。php
工欲善其事,必先利其器。咱們接下來先來熟悉下Android Studio的界面
html
通常分析內存泄露, 首先運行程序,打開日誌控制檯,有一個標籤Memory ,咱們能夠在這個界面分析當前程序使用的內存狀況, 一目瞭然, 咱們不再須要苦苦的在logcat中尋找內存的日誌了。java
圖中藍色區域,就是程序使用的內存, 灰色區域就是空閒內存,
固然,Android內存分配機制是對每一個應用程序逐步增長, 好比你程序當前使用30M內存, 系統可能會給你分配40M, 當前就有10M空閒, 若是程序使用了50M了,系統會緊接着給當前程序增長一部分,好比達到了80M, 當前你的空閒內存就是30M了。 固然,系統若是不能再給你分配額外的內存,程序天然就會OOM(內存溢出)了。 每一個應用程序最高能夠申請的內存和手機密切相關,好比我當前使用的華爲Mate7,極限大概是200M,算比較高的了, 通常128M 就是極限了, 甚至有的手機只有可憐的16M或者32M,這樣的手機相對於內存溢出的機率很是大了。android
首先須要明白一個概念, 內存泄露就是指,本應該回收的內存,還駐留在內存中。
通常狀況下,高密度的手機,一個頁面大概就會消耗20M內存,若是發現退出界面,程序內存遲遲不下降的話,可能就發生了嚴重的內存泄露。
咱們能夠反覆進入該界面,而後點擊dump java heap 這個按鈕,而後Android Studio就開始幹活了,下面的圖就是正在dump
git
dump成功後會自動打開 hprof文件,文件以Snapshot+時間來命名
github
經過Android Studio自帶的界面,查看內存泄露還不是很智能,咱們能夠藉助第三方工具,常見的工具就是MAT了,下載地址 http://eclipse.org/mat/downloads.php ,這裏咱們須要下載獨立版的MAT. 下圖是MAT一開始打開的界面, 這裏須要提醒你們的是,MAT並不會準確地告訴咱們哪裏發生了內存泄漏,而是會提供一大堆的數據和線索,咱們須要本身去分析這些數據來去判斷究竟是不是真的發生了內存泄漏。canvas
接下來咱們須要用MAT打開內存分析的文件, 上文給你們介紹了使用Android Studio生成了 hprof文件, 這個文件在呢, 在Android Studio中的Captrues這個目錄中,能夠找到
android-studio
注意,這個文件不能直接交給MAT, MAT是不識別的, 咱們須要右鍵點擊這個文件,轉換成MAT識別的。
app
而後用MAT打開導出的hprof(File->Open heap dump) MAT會幫咱們分析內存泄露的緣由
eclipse
上面介紹了MAT檢測內存泄露, 再給你們介紹LeakCanary。
項目地址:https://github.com/square/leakcanary
LeakCanary會檢測應用的內存回收狀況,若是發現有垃圾對象沒有被回收,就會去分析當前的內存快照,也就是上邊MAT用到的.hprof文件,找到對象的引用鏈,並顯示在頁面上。這款插件的好處就是,能夠在手機端直接查看內存泄露的地方,能夠輔助咱們檢測內存泄露
使用:
在build.gradle文件中添加,不一樣的編譯使用不一樣的引用:
1
2
3
4
|
<code
class
=
" hljs matlab"
>dependencies {
debugCompile
'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile
'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}</code>
|
在應用的Application onCreate方法中添加LeakCanary.install(this),以下
1
2
3
4
5
6
7
|
<code
class
=
" hljs java"
>
public
class
ExampleApplication
extends
Application
@Override
public
void
onCreate() {
super
.onCreate();
LeakCanary.install(
this
);
}
}</code>
|
應用運行起來後,LeakCanary會自動去分析當前的內存狀態,若是檢測到泄漏會發送到通知欄,點擊通知欄就能夠跳轉到具體的泄漏分析頁面。
Tips:就目前使用的結果來看,絕大部分泄漏是因爲使用單例模式hold住了Activity的引用,好比傳入了context或者將Activity做爲listener設置了進去,因此在使用單例模式的時候要特別注意,還有在Activity生命週期結束的時候將一些自定義監聽器的Activity引用置空。
關於LeakCanary的更多分析能夠看項目主頁的介紹,還有這裏http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
若是咱們想了解內存分配更詳細的狀況,可使用Allocation Traker來查看內存到底被什麼佔用了。
用法很簡單:
點一下是追蹤, 再點一下是中止追蹤, 中止追蹤後 .alloc文件會自動打開,打開後界面以下:
當你想查看某個方法的源碼時,右鍵選擇的方法,點擊Jump to source就能夠了
Android Studio 功能愈來愈強大了, 咱們能夠藉助AS觀測各類性能,以下圖:
若是咱們要觀測方法執行的時間,就須要來到CPU界面
點擊Start Method Tracking, 一段時間後再點擊一次, trace文件被自動打開,
非獨佔時間: 某函數佔用的CPU時間,包含內部調用其它函數的CPU時間。
獨佔時間: 某函數佔用CPU時間,但不含內部調用其它函數所佔用的CPU時間。
經過方法的調用次數和獨佔時間來查看,一般判斷方法是:
若是方法調用次數很少,但每次調用卻須要花費很長的時間的函數,可能會有問題。 若是自身佔用時間不長,但調用卻很是頻繁的函數也可能會有問題。上面給你們介紹了若干使用Android Studio檢查程序性能的工具,工具永遠是輔助,不要由於工具耽誤太長時間。若是有問題,歡迎你們糾正。