排查方法1:LeakCanary
第一步添加依赖
app/build.gradle
dependencies{
....
//意思是debug模式下,才会包含功能代码,release下,只有几个类,里面都是空壳。例如:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
}
第二步初始化
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
/**
* 如果当前进程是用来给LeakCanary进行堆分析的则return,否则会执行LeakCanary的install方法。这样我们就可以
*
* 使用LeakCanary了,如果检测到某个Activity有内存泄露,LeakCanary就会给出提示。
*/
if(LeakCanary.isInAnalyzerProcess(this)){
return;
}
LeakCanary.install(this);
}
}
排查方法2:Mat(Memory Analysis Tools)
下载地址https://www.cnblogs.com/linghu-java/articles/10565730.html
准备工作:
1.首先把MAT工具下载好,下载地址 https://www.eclipse.org/downloads/download.php?file=/mat/1.9.1/rcp/MemoryAnalyzer-1.9.1.20190826-win32.win32.x86_64.zip
2.打开DDMS,因为DMS可以生成内存使用记录文件,但AdroidStudio3.0以后在工具栏到不到DDMS,解决办法:https://blog.csdn.net/aurora__/article/details/82658856
步骤一:我们用直接找到安装包里去打开DDMS,进入到目录D:\AndroidSDK\Sdk\tools打开DDMS,双击emulator.exe
步骤二:打开DDMS,找到目标进程,点击Dump hprof file ,生成内存记录文件。
步骤三:进入到目录D:\AndroidSDK\Sdk\platform-tools,将步骤二中生成的com.exmaple.memorydemo.hprof文件拷贝到当前目录
步骤四:使用cmd执行命令: hprof-conv com.example.memorydemo.hprof com.example.memorydemo-conv.hprof (因为MAT识别hprof文件,只能识别hprof-conv文件)
步骤五:解压步骤一中下载的文件,双击elicpsec.exe ,找开应用Elipse Memory Analyzer
步骤六:在overview选项中, 找到Biggest Objects byRetained Size,点击Histogram进入对象列表列表模式。
步骤七:因为列表中对象特别多,成千上万个,所以我们需要写一些条件筛选我们关注的对象。例如示例中我们查询Activity内存泄露,在最上面ClassName <Regex>里写上Activity。
步骤八:在列表中可以看到每个Activity在内存中存在的对象个数。个数比较多的就可能是存在内存泄露
步骤九:右键单击目标对象,选择Merge Shorest Path to GC Roots ->execlude all phantom/weak/soft .etc references
步骤十:一直点击展开引用树,就能发现是谁调用了Activity导致类存泄露。