編輯:關於Android編程
內存洩露,是Android開發者最頭疼的事。可能一處小小的內存洩露,都可能是毀於千裡之堤的蟻穴。
怎麼才能檢測內存洩露呢?網上教程非常多,不過很多都是使用Eclipse檢測的, 其實1.3版本以後的Android Studio 檢測內存非常方便, 如果結合上MAT工具,LeakCanary插件,一切就變得so easy了。
工欲善其事,必先利其器。我們接下來先來熟悉下Android Studio的界面
一般分析內存洩露, 首先運行程序,打開日志控制台,有一個標簽MemZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcnkgLM7Sw8e/ydLU1NrV4rj2vefD5rfWzva1scews8zQ8sq508O1xMTatObH6b/2LCDSu8S/wcvIuywgztLDx9TZ0rKyu9Do0qq/4L/gtcTU2mxvZ2NhdNbQ0bDV0sTatOa1xMjV1r7By6GjPC9wPgoKPHA+PHN0cm9uZz7NvNbQwLbJq8f40/KjrL7NysezzNDyyrnTw7XExNq05qOsILvSyavH+NPyvs3Kx7/Vz9DE2rTmo6w8L3N0cm9uZz4gPGJyPgq1sci7o6xBbmRyb2lkxNq05rfWxeS7+tbGyse21MO/uPbTptPDs8zQ8tbwsr3U9rzTLCCxyMjnxOOzzNDytbHHsMq508MzME3E2rTmLCDPtc2zv8nE3LvhuPjE47fWxeQ0ME0sILWxx7C+zdPQMTBNv9XP0CwgyOe5+7PM0PLKudPDwcs1ME3ByyzPtc2zu+G99L3T18W4+LWxx7CzzNDy1Pa809K7sr+31iyxyMjntO+1vcHLODBNo6wgILWxx7DE47XEv9XP0MTatOa+zcrHMzBNwcuhoyAgtbHIuyzPtc2zyOe5+7K7xNzU2bj4xOO31sXktu7N4rXExNq05iyzzNDy19TIu77Nu+FPT00oxNq05tLns/YpwcuhoyDDv7j206bTw7PM0PLX7rjfv8nS1Mnqx+u1xMTatOa6zcrWu/rD3MfQz+C52KOsscjI587StbHHsMq508O1xLuqzqpNYXRlNyy8q8/etPO4xcrHMjAwTSzL47HIvc+437XEwcssICDSu7DjMTI4TSC+zcrHvKvP3sHLLCDJ9dbB09C1xMrWu/rWu9PQv8nBr7XEMTZNu/LV3zMyTaOs1eLR+bXEyta7+s/gttTT2sTatObS57P2tcS4xcLKt8ezo7TzwcuhozwvcD4KCgoKPGgyIGlkPQ=="我們怎麼檢測內存洩露呢">我們怎麼檢測內存洩露呢
首先需要明白一個概念, 內存洩露就是指,本應該回收的內存,還駐留在內存中。
一般情況下,高密度的手機,一個頁面大概就會消耗20M內存,如果發現退出界面,程序內存遲遲不降低的話,可能就發生了嚴重的內存洩露。
我們可以反復進入該界面,然後點擊dump java heap 這個按鈕,然後Android Studio就開始干活了,下面的圖就是正在dump
dump成功後會自動打開 hprof文件,文件以Snapshot+時間來命名
通過Android Studio自帶的界面,查看內存洩露還不是很智能,我們可以借助第三方工具,常見的工具就是MAT了,下載地址 http://eclipse.org/mat/downloads.php ,這裡我們需要下載獨立版的MAT. 下圖是MAT一開始打開的界面, 這裡需要提醒大家的是,MAT並不會准確地告訴我們哪裡發生了內存洩漏,而是會提供一大堆的數據和線索,我們需要自己去分析這些數據來去判斷到底是不是真的發生了內存洩漏。
接下來我們需要用MAT打開內存分析的文件, 上文給大家介紹了使用Android Studio生成了 hprof文件, 這個文件在呢, 在Android Studio中的Captrues這個目錄中,可以找到
注意,這個文件不能直接交給MAT, MAT是不識別的, 我們需要右鍵點擊這個文件,轉換成MAT識別的。
然後用MAT打開導出的hprof(File->Open heap dump) MAT會幫我們分析內存洩露的原因
上面介紹了MAT檢測內存洩露, 再給大家介紹LeakCanary。
項目地址:https://github.com/square/leakcanary
LeakCanary會檢測應用的內存回收情況,如果發現有垃圾對象沒有被回收,就會去分析當前的內存快照,也就是上邊MAT用到的.hprof文件,找到對象的引用鏈,並顯示在頁面上。這款插件的好處就是,可以在手機端直接查看內存洩露的地方,可以輔助我們檢測內存洩露
使用:
在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觀測各種性能,如下圖:
如果我們要觀測方法執行的時間,就需要來到CPU界面
點擊Start Method Tracking, 一段時間後再點擊一次, trace文件被自動打開,
非獨占時間: 某函數占用的CPU時間,包含內部調用其它函數的CPU時間。
獨占時間: 某函數占用CPU時間,但不含內部調用其它函數所占用的CPU時間。
通過方法的調用次數和獨占時間來查看,通常判斷方法是:
如果方法調用次數不多,但每次調用卻需要花費很長的時間的函數,可能會有問題。 如果自身占用時間不長,但調用卻非常頻繁的函數也可能會有問題。上面給大家介紹了若干使用Android Studio檢查程序性能的工具,工具永遠是輔助,不要因為工具耽誤太長時間。如果有問題,歡迎大家糾正。
之前在三星手機上看到點擊屏幕後出現水波的特效,所以嘗試著寫了個類似的效果 實現自定義一個View,並實現構造方法public class MyView exte
復習一下view滑動的幾種實現方式1.通過layout實現通過不斷重新layout view 達到滑動的效果。 @Override public boolea
本文演示android中圖片加載到內存首先設計界面:代碼如下:<LinearLayout xmlns:android=http://schemas.android.
南周知道 要嚴肅,有知識;要八卦,有內幕。每天一篇,盡享你想知道的和不知道的,我們只想,讓知道成為一種享受。請記住知道,南方周末每日網絡專稿。 1.每天推送一篇你想知道的