Volley引起的内存泄漏--安卓怎么查内存泄漏(上)

项目里内存泄漏严重友盟后台各种OOM 迭代速度快,真的没时间优化。
我的时间啊。。。

偶然的机会通过As的Android Monitor里的内存监控手动回收发现项目中启动次数最多的界面竟然不能被回收。

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 image.png

第一个小车就是出发手动GC的按钮

在它占了很大内存时尤为明显,我这个暴脾气,哪儿不舍得放他走呢。分析开始。。。

我们分析内存一般需要先拿到当前内存的快照,拿到生成文件去mat中分析。通过什么获取快照呢也是上面工具栏图片里小车后面的按钮(有一个尖头,表示这个时刻的内存情况),再后面一个按钮是一个区间内的内存情况。

我们点击小车后面的按钮 ,就会获取当前的内存状况了(会有点卡)。前提是这个时刻表示回收不正常(内存泄漏界面已经退出,并且不能被回收掉),不能在内存泄漏的界面还在显示就生成快照。

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 image.png

获取结束后 会生成一个.hprof 的文件,我们需要拿这个文件的生成文件到安卓内存分析工具MAT中分析内存情况。这个文件在as中也可以初步的查看各个类的引用情况和内存占用情况,但不能很好的发现问题。

MAT安装请自行百度(mac有个坑,需要自己添加日志路径,要不无法启动)
生成文件获取(使用AS)

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 image.png
《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 image.png

点击Captures 找到刚才生成的文件,右键点击最后一个,填写上生成的路径,就可以开始使用mat分析了。

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 mat

打开mat,打开我们刚才生成的文件,会进入如下界面。他会展示当前时刻app内内存大致情况。但我们需要找到具体的类,具体分析。

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 image.png

我们主要使用这个工具栏操作 ,mat提供了类似sql的查询语句,我们需要查到内存泄漏的类。
**select * from instanceof android.app.Actiivty **
类似这种,还有很多
我们点击上面工具栏的第4个按钮,输入查询语句,点击工具栏中的红色感叹号按钮进行查询,会出现关于这个类全部引用,表示这个类的各种引用。这只是mat最最最初阶的使用,进阶使用会再了解。

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 image.png

我们需要找到到底是什么引用了它导致它无法回收,怎么找呢,右键我们找的类,点击
Path To GC Roots(GC root是内存回收的根)> exclude soft/weak references(软引用和弱引用都懂)

《Volley引起的内存泄漏--安卓怎么查内存泄漏(上)》 结果

这时候就会出现排除软引用和弱引用,哪儿个强引用在引用它,哈哈 他就是醉鬼祸首。
一看是Volley你啊。哈哈哈。。。。

怎么处置(解决)它呢。。。。

    原文作者:ZSACH
    原文地址: https://www.jianshu.com/p/e43d2bf08032
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞