内存泄漏(Memory Leak):在程序中申请了一块内存,由于某种原因一直未释放,造成系统内存的浪费,如果不断的申请还会导致内存溢出(Out Of Memory,OOM)。
介于项目客观条件限制,故使用**Android Studio的 Profiler和MAT(Memory Analyzer Tools)**来分析内存泄漏问题。
在真机上检测内存泄漏,需要打开ADB调试
一、Android Profiler
1、打开方式: View > Tool Windows > Profiler
2、启动方式:点击 + 加载对应app进程
3、添加设备后,运行Profiler
4、点击MEMORY后,显示如下界面
1)、下图中1的位置:Dump java heap
2)、下图中2的位置:stop the current profiling session
5、点击Dump java head 后,开始记录,生成Heap Dump
6、右键Heap Dump(上图中2的位置)——Export——选择位置进行保存
二、MAT(Memory Analyzer Tools)
1、MAT工具下载地址 (https://www.eclipse.org/mat/)
特别需要强调
保存后的文件通过sdk里的hprof-conv.exe转换格式,否则用MAT软件无法打开,弹出如下的提示
hprof-conv.exe所在路径如下:
通过CMD进行转换~
2、打开MAT工具
3、打开转换后的 Heap Dump文件
File——Open Heap Dump…——选择文件——打开——Finish
4、create a histogram(直方图)——点击图中圆圈位置
生成的Histogram中:
Shallow Heap :指对象本身占据的内存大小(不包含其引用的对象),对于常规对象(非数组)指的是其成员变量的数量及类型;对于数组类型的对象指的是数组元素大小的总和,包含数组类型及数组长度。
Retained Heap:当前对象的大小+当前对象可直接或间接引用到的对象的大小的总和,并且不包含被GC Roots 直接或间接引用的对象
在下图圆圈位置输入Fragment\Activity ,进而排查泄漏位置
右键其中一个
1)、Merge Shortest Paths to GC Roots ——>exclude all weak/soft references :该对象到GC Roots节点的最短引用路径,去除所有弱引用;
2)、Merge Shortest Paths to GC Roots——>With all references :从该对象到GC Roots节点最短引用路径,包含所有引用类型
3)、Merge Shortest Paths to GC Roots——>exclude all phantom/weak/soft etc.references :排除软弱引用,查看强引用
结合代码,分析对应界面有哪些泄漏