android内存分析:heap Snapshot的使用

网上有很多讲解关于android studio中memory工具的使用,接下来我来说一段在项目中发生的实例;大家可以根据我的这个方法来分析自己项目中的问题

首先我们要通过手动先触发GC操作,点击memory面板中的“小黄车”,内存稳定后点击dump java heap 按钮;过一会android studio会自动生成,堆内存中对象的列表文件扩展名为.hprof文件!如下图:

android内存分析:heap Snapshot的使用

在这张图片中我们需要重点观察.hprof的左半区,显示的方式为app heap,就是应用中堆对象列表,紧当前状态下的列表。这个列表中可能包含你想要的对象或者是你不想要的对象,当然我们看这个列表的初衷是列表中都是我们希望存在的对象;所以我们这个时候就要分析应该被GC掉的对象为什么还会存在这里!如果存在了,吼吼那就是已经发生内存泄漏了。

这张图片是在我真实的产品中所截图,但是高亮显示中的BrowEntity确实是应该释放的对象,相信大伙已经猜到了这个对象指的就是一个表情实体,那么选中这个表情实体之后右侧就会出现这个表情实体对象所有的实例。点击某一个实例的时候会看到右侧面板出现的实例属性等。而下面的ReferenceTree正是其中一个BrowEntity实例的引用所在,是一个ArrayList中!所以这个对象引用未释放的原因就找到了,解决方法可以是在Fragment的onDestroy中将ArrayList=null;执行;当然这里还有个问题就是再次初始化的时候仍然需要借用ArrayList,当然这不是我要谈论问题的重点,这里可以自己权衡。所以我们可以利用这种方式排查占用内存较大的对象如果不需要驻在内存当中就可以选择适当方式进行引用清理,从而达到节省内存的目标!

      当然在分析这个列表哪些对象占用空间比较大时我们可以根据表头含义对其排序;表头列含义如下:

名称 意义
Total Count 内存中该类的对象个数
Heap Count 堆内存中该类的对象个数
Sizeof 物理大小
Shallow size 该对象本身占有内存大小
Retained Size 释放该对象后,节省的内存大小

上一篇:Gibbs sampling


下一篇:WPF学习笔记1——XAML之1