
本文的合集已經(jīng)編著成書,高級Android開發(fā)強化實戰(zhàn),歡迎各位讀友的建議和指導(dǎo)。在京東即可購買:https://item.jd.com/12385680.html

MAT(Memory Analyzer Tool), 是著名的Android內(nèi)存分析工具, 雖然LeakCanary更加便捷, 但是MAT可以清楚地獲知整體內(nèi)存使用情況, 還是必須要掌握的. 我來講解一下如何使用.
1. 內(nèi)存文件
使用Android Studio底部的AndroidMonitor, 獲取內(nèi)存片段.
點擊Initial GC回收內(nèi)存, 使用應(yīng)用, Dump Java Heap, 再次點擊停止.

在Android的SDK中的platform-tools文件夾內(nèi), hprof-conv腳本把AS的內(nèi)存格式轉(zhuǎn)換為MAT的內(nèi)存格式. 之后, 使用MAT打開文件.
使用命令
./hprof-conv path/file.hprof exitPath/heap-converted.hprof
2. 分析內(nèi)存
下載Eclipse的MAT工具.
雖然是Eclipse的工具, 但是可以單獨運行, 并不需要安裝Eclipse.
打開內(nèi)存片段, 選擇內(nèi)存報告.

內(nèi)存整體情況.

選擇直方圖樣式, 添加包名過濾.

3. 判斷泄露
Activity或View大于1個對象, 都有可能發(fā)生內(nèi)存泄露.
顯示內(nèi)存的所有引用情況

逐個判斷即可, 有些對象的引用較多, 可能是使用了數(shù)組, 并不一定是內(nèi)存泄露.
顯示單個類的內(nèi)存情況

使用搜索功能, 輸入SQL語句, 并執(zhí)行. 紅色嘆號執(zhí)行搜索.
通過觀察, 我們發(fā)現(xiàn)微信mWXApi傳入了錯誤的Context, 導(dǎo)致內(nèi)存泄露.

代碼
mFriendsPlatform = new WXSharePlatform(mActivity, title, content,
bitmap, pageUrl, SendMessageToWX.Req.WXSceneTimeline);
直接傳入Activity導(dǎo)致內(nèi)存泄露, 修改為getApplicationContext即可.
其實還比較復(fù)雜, 簡單的方法是使用LeakCanary, 參考.
OK, that's all! Enjoy it!