AndroidStudio 的Profiler+Mat检测内存泄漏

什么是内存泄漏

申请了一块内存空间,但是一直没有释放。如果不断的申请还会引起内存溢出(OOM)

什么是内存抖动

频繁的GC操作,如果垃圾回收的速度没有生成的快,也会引起OOM

如何检测?

我使用的是Profiler+Mat,前提是必须要ADB调试

AndroidStudio 的Profiler+Mat检测内存泄漏

MAT工具下载地址 (https://www.eclipse.org/mat/)

运行完Profiler会出现

AndroidStudio 的Profiler+Mat检测内存泄漏

点击MEMORY部分

AndroidStudio 的Profiler+Mat检测内存泄漏

点击下载 开始记录

AndroidStudio 的Profiler+Mat检测内存泄漏

生成

AndroidStudio 的Profiler+Mat检测内存泄漏

右键Heap Dump导出文件

AndroidStudio 的Profiler+Mat检测内存泄漏

AndroidStudio 的Profiler+Mat检测内存泄漏

然后将该文件通过sdk里的hprof-conv.exe转一下文件

AndroidStudio 的Profiler+Mat检测内存泄漏

注意:adb调试是在你的hprof-conv的目录下 将你生成的hprof文件转一下文件  目录就是生成temp.hprof文件以及生成mat需要的文件目录(任意目录)

AndroidStudio 的Profiler+Mat检测内存泄漏

打开Mat  点击MemoryAnalyzer.exe

AndroidStudio 的Profiler+Mat检测内存泄漏

点击File 

AndroidStudio 的Profiler+Mat检测内存泄漏

之后点击Open Heap Dump...  选择生成的mat可以打开的memory.hprof文件

AndroidStudio 的Profiler+Mat检测内存泄漏

点击finish

AndroidStudio 的Profiler+Mat检测内存泄漏

点击标记

AndroidStudio 的Profiler+Mat检测内存泄漏

在该位置输入(Fragment|Activity 来排查你的Fragment|Activity的泄漏位置)

AndroidStudio 的Profiler+Mat检测内存泄漏

右键选择一个点击

AndroidStudio 的Profiler+Mat检测内存泄漏

这个表示GC Roots 所持有的所有的引用

也可以点击Merge Shortest Paths to GC Roots  点击 exclude all phantom/weak/soft etc.references 这个意思是排除软弱引用

查看强引用

之后就可以查看当前的页面持有什么强引用了

AndroidStudio 的Profiler+Mat检测内存泄漏

 

如何处理内存泄漏

一个图片就明白了

AndroidStudio 的Profiler+Mat检测内存泄漏

把当前持有GC root 与下一个持有的断开GC就可以释放当前内存