1. 程式人生 > >使用新版Android Studio檢測內存泄露和性能

使用新版Android Studio檢測內存泄露和性能

qq空間 fun selection book 檢測 內存 lips info ava

http://www.jianshu.com/p/216b03c22bb8

內存泄露,是Android開發者最頭疼的事。可能一處小小的內存泄露,都可能是毀於千裏之堤的蟻穴。怎麽才能檢測內存泄露呢?網上教程非常多,不過很多都是使用Eclipse檢測的, 其實1.3版本以後的Android Studio 檢測內存非常方便, 如果結合上MAT工具,LeakCanary插件,一切就變得so easy了。

熟悉Android Studio界面工欲善其事,必先利其器。

我們接下來先來熟悉下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並不會準確地告訴我們哪裏發生了內存泄漏,而是會提供一大堆的數據和線索,我們需要自己去分析這些數據來去判斷到底是不是真的發生了內存泄漏。

技術分享
MAT主界面

接下來我們需要用MAT打開內存分析的文件, 上文給大家介紹了使用Android Studio生成了 hprof文件, 這個文件在呢, 在Android Studio中的Captrues這個目錄中,可以找到

技術分享
hprof目錄]

註意,這個文件不能直接交給MAT, MAT是不識別的, 我們需要右鍵點擊這個文件,轉換成MAT識別的。

技術分享
導出標準的hprof

然後用MAT打開導出的hprof(File->Open heap dump) MAT會幫我們分析內存泄露的原因

技術分享
打開標準的hprof 技術分享
自動分析內存泄露的原因

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引用置空。

關於LeakCanary的更多分析可以看項目主頁的介紹,還有這裏
http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

追蹤內存分配

如果我們想了解內存分配更詳細的情況,可以使用Allocation Traker來查看內存到底被什麽占用了。用法很簡單:

技術分享
點擊追蹤內存分配

點一下是追蹤, 再點一下是停止追蹤, 停止追蹤後 .alloc文件會自動打開,打開後界面如下:

技術分享
追蹤內存結構展示


當你想查看某個方法的源碼時,右鍵選擇的方法,點擊Jump to source就可以了

查詢方法執行的時間

Android Studio 功能越來越強大了, 我們可以借助AS觀測各種性能,如下圖:

技術分享
檢測性能界面


Android studio2.1 界面發生了變化,功能沒有太大區別:

技術分享
新版本界面

如果我們要觀測方法執行的時間,就需要來到CPU界面

技術分享
追蹤方法耗時

點擊Start Method Tracking, 一段時間後再點擊一次, trace文件被自動打開,

技術分享
結果

非獨占時間: 某函數占用的CPU時間,包含內部調用其它函數的CPU時間。
獨占時間: 某函數占用CPU時間,但不含內部調用其它函數所占用的CPU時間。

我們如何判斷可能有問題的方法?

通過方法的調用次數和獨占時間來查看,通常判斷方法是:

  1. 如果方法調用次數不多,但每次調用卻需要花費很長的時間的函數,可能會有問題。
  2. 如果自身占用時間不長,但調用卻非常頻繁的函數也可能會有問題。

綜述

上面給大家介紹了若幹使用Android Studio檢查程序性能的工具,工具永遠是輔助,不要因為工具耽誤太長時間。如果有問題,歡迎大家糾正。

最近開通了微信公眾賬號,大家捧場啊

技術分享
微信公眾賬號:likeDev Android實用技術 ? 著作權歸作者所有 舉報文章 技術分享 於連林520wcf

寫了 62500 字,被 1268 人關註,獲得了 2495 個喜歡

微信公眾賬號: likeDev QQ學習群:488929846 Android電子書: http://book.520wcf.com 視頻地址: http://youku.520wcf.com CSDN博客地址:http://blog.csdn.net/yulianlin

更多精彩內容,關註微信公眾賬號likeDev,如果作品對您有所幫助,隨意打賞

更多分享
技術分享
後發表評論
35條評論 只看作者 按喜歡排序按時間正序按時間倒序 技術分享 mrwangyong 6樓 · 2016.01.02 19:49

好東西,謝謝摟住

1人贊 回復 技術分享 追風917 2樓 · 2015.12.27 05:40

不錯

贊 回復

於連林520wcf: @追風917 多謝支持了

2015.12.29 09:12 回復

還我漂漂拳哦: @於連林520wcf 確實不錯

2016.06.01 11:33 回復 添加新評論 技術分享 MrFu 3樓 · 2015.12.27 17:26

棒極了

贊 回復

於連林520wcf: @MrFu 班門弄斧了

2015.12.29 09:12 回復 添加新評論 技術分享 lo_android 4樓 · 2015.12.29 20:36

好東西

贊 回復

於連林520wcf: @lo_android 謝謝支持

2015.12.30 07:42 回復 添加新評論 技術分享 勤奮小喜子 5樓 · 2016.01.01 00:33

贊啊

贊 回復 技術分享 小蛤蟆智 7樓 · 2016.04.09 11:11

好文。

贊 回復 技術分享 ChrisYuu 8樓 · 2016.04.15 14:42

請問怎麽根據深度來定位哪裏內存泄漏呢?

贊 回復 技術分享 孤獨的樹葉 9樓 · 2016.04.16 21:39

很好

贊 回復 技術分享 黃蓋突然 10樓 · 2016.04.28 13:41

收藏了

贊 回復 技術分享 QQ00001 11樓 · 2016.04.28 13:49

正在發愁的時候,搜索到了於大神的這篇文章

贊 回復 技術分享 SwitchCase 12樓 · 2016.04.28 17:40

支持

贊 回復

於連林520wcf: @SwitchCase 謝謝

2016.04.28 17:54 回復 添加新評論 技術分享 米陽MeYoung 13樓 · 2016.04.30 23:56

學習了

贊 回復 技術分享 微涼一季 14樓 · 2016.05.10 22:49

必須贊啊

使用新版Android Studio檢測內存泄露和性能