之前碰到的OOM問題,終于很直白的呈現在我的眼前:我嘗試了MAT,但是發現不怎麼會用。直到今天終于發現了這個新工具:
當我們的App中存在記憶體洩露時會在通知欄彈出通知:

當點選該通知時,會跳轉到具體的頁面,展示出Leak的引用路徑,如下圖所示:
LeakCanary 可以用更加直白的方式将記憶體洩露展現在我們的面前。
以下是我找到的學習資料,寫的非常棒:
AndroidStudio (官方)上使用LeakCanary 請移步:
<a href="https://github.com/square/leakcanary">https://github.com/square/leakcanary</a>
Eclipse 上使用LeakCanary 請移步我的:
<a href="https://github.com/SOFTPOWER1991/LeakcanarySample-Eclipse">https://github.com/SOFTPOWER1991/LeakcanarySample-Eclipse</a>
<a href="https://github.com/SOFTPOWER1991/leakcanarySample_androidStudio">leakcanarySample_androidStudio</a>
工程包括:
LeakCanary庫代碼
LeakCanaryDemo示例代碼
使用步驟:
将LeakCanary import 入自己的工程
添加依賴:
<code>compile project(':leakcanary')</code>
在Application中進行配置
在Activity中進行配置
在AndroidMainfest.xml 中進行配置,添加如下代碼
5、測試結果
a、Toast顯示(大概10秒左右顯示)
b、通知顯示
c、桌面自動添加的圖表
d、記憶體洩露清單
e、記憶體洩露詳細
LogCat可以看到日志日下(hprof檔案可以用MAT打開進行分析):
01-04 11:49:41.815 12967-13004/com.micky.leakcanarysamples I/dalvikvm: hprof: dumping heap strings to "/storage/emulated/0/Download/leakcanary/suspected_leak_heapdump.hprof".
01-04 11:49:42.020 12967-13004/com.micky.leakcanarysamples I/dalvikvm: hprof: heap dump completed (28850KB)
檢視自動生成的AndroidManifest檔案,LeakCanarySamples/app/build/intermediates/manifests/full/debug/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.micky.leakcanarysamples"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="23" />
<!-- To store the heap dumps and leak analysis results. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name="com.micky.leakcanarysamples.BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity
android:name="com.micky.leakcanarysamples.MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.micky.leakcanarysamples.TestActivity" />
<service
android:name="com.squareup.leakcanary.internal.HeapAnalyzerService"
android:enabled="false"
android:process=":leakcanary" />
android:name="com.squareup.leakcanary.DisplayLeakService"
android:enabled="false" />
android:name="com.squareup.leakcanary.internal.DisplayLeakActivity"
android:icon="@drawable/__leak_canary_icon"
android:label="@string/__leak_canary_display_activity_label"
android:taskAffinity="com.squareup.leakcanary"
android:theme="@style/__LeakCanary.Base" >
</application>
</manifest>
如上所示LeakCanary給我們自動添加了兩個Service和一個Activity,并添加了對SD卡的讀寫權限
注:
1、如果在Release模式下請使用RefWatcher.DISABLED
2、在Activity或Fragment 的 Destroy方法中添加檢測(很好了解,就是判斷一個Activity或Fragment想要被銷毀的時候,是否還有其他對象持有其引用導緻Activity或Fragment不能被回收,進而導緻記憶體洩露)
本文轉自 一點點征服 部落格園部落格,原文連結:http://www.cnblogs.com/ldq2016/p/8472721.html,如需轉載請自行聯系原作者