方法一:LeakCanary
1、在build.gradle里导入 implementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
2、在application中初始化LeakCanary
private void initLeakCanary() {
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
}
3、使用APP时,当出现内存泄漏时,会弹出相应的提示,出现提示时打开Leaks可查看到内存泄漏的堆栈信息
方法二:DDMS+MAT
1、安装Android SDK,使用Android SDK自带的一个工具monitor,运行monitor,然后进入 DDMS管理界面,连接手机,按下图执行操作获取 hprof文件
(注:如果未出现连接设备,请查看是否打开USB调试模式)

2、转换 hprof文件,DDMS Dump出的文件要经过转换才能被 MAT识别,Android SDK提供了这个工具 hprof-conv,把步骤一保存的内存文件通过hprof-conv转换,执行命令hprof-conv xxx-a.hprof xxx-b.hprof
3、安装内存分析工具Memory Analyzer Tool,用MAT打开转换后的 hprof文件
,File->Open Heap Dump,打开后如图

4、Histogram查询,点击 Actions下的 Histogram项将得到 Histogram结果:

5、按类名将所有的实例对象列出来,可以点击表头进行排序,在表的第一行可以输入正则表达式来匹配结果 :

6、在某一项上右键打开菜单选择list objects ->with incoming refs将列出该类的实例:


7、它展示了对象间的引用关系,快速找出某个实例没被释放的原因,可以右健Path to GC Roots-->exclue all phantom/weak/soft etc.reference :


8、用这个方法可以快速找到某个对象的GC Root,一个存在 GC Root的对象是不会被 GC回收掉的