标签:
参考文章:Heap Viewer
可以直接在Android studio工具栏中直接点击小机器人启动:
还可以在Android studio的菜单栏中Tools也可以:
如果你不用Android studio,可以在SDK下的tools下的monitor程序打开:
按上图的标记顺序按下,我们就能看到内存的具体数据,右边面板中数值会在每次GC时发生改变,包括App自动触发或者你来手动触发。
ok,现在来解释下面板中的名词
列名 | 意义 |
---|---|
Heap Size | 堆栈分配给App的内存大小 |
Allocated | 已分配使用的内存大小 |
Free | 空闲的内存大小 |
%Used | Allocated/Heap Size,使用率 |
Objects | 对象数量 |
类型 | 意义 |
---|---|
free | 空闲的对象 |
data object | 数据对象 |
class object | 类对象 |
1-byte array(byte[],boolean[]) | 一个字节的数组对象 |
2-byte array(short[],char[]) | 两个字节的数组对象 |
4-byte array(long[],double[]) | 4个字节的数组对象 |
non-Java object | 非Java对象 |
下面是每一个对象都有的列名含义:
列名 | 意义 |
---|---|
Count | 数量 |
Total Size | 总共占用的内存大小 |
Smallest | 将对象占用内存的大小从小往大排,排在第一个的对象占用内存大小 |
Largest | 将对象占用内存的大小从小往大排,排在最后一个的对象占用的内存大小 |
Median | 将对象占用内存的大小从小往大排,拍在中间的对象占用的内存大小 |
Average | 平均值 |
当我们点击某一行时,可以看到如下的柱状图:
横坐标是对象的内存大小,这些值随着不同对象是不同的,纵坐标是在某个内存大小上的对象的数量
我们说Heap Viewer适合发现内存泄漏的问题,那你知道何为内存泄漏么?
英文名:Memory Leaks
标准解释:无用的单纯,但是还是没GC ROOT引用的内存
通俗解释:该死不死的内存
那么如何检测呢?Heap Viewer中的数值会自动在每次发生GC时会自动更新,那么我们是等着他自己GC么?小弟不才,刚开始我就是这么一直等啊等,由于GC的时机是系统把握的,所以很不好把握,既然我们是来看内存泄漏,那么我们在需要检测内存泄漏的用例执行过后,手动GC下,然后观察(Heap Size/Allocated)内存的情况,看看内存是不是会回到一个稳定值,多次操作后,只要内存是稳定在某个值,那么说明没有内存溢出的,如果发现内存在每次GC后,都在增长,不管是慢增长还是快速增长,都说明有内存泄漏的可能性。
那么内存对象详情表格有什么作用呢?我们只需要看总览表格中的数值就能知道了Memory Leaks了啊,还要这个东西干嘛?知道Memory Leaks后就要分析在什么地方发生了,对象详情表格中的数值也会在每次GC后更新,我们可以通过每次更新,粗略的定位到哪一种类型的对象发生了增加,这样对我们来说需要查找对象的范围缩小了很多,比如在发生内存泄漏的时候,我们发现只有class object
在增加(当然这种情况很极端,我只是打个比喻),我们在使用MAT或者Allocation Tracker时候会只看类对象的内存情况,刨除了对byte[]/char[]等数组对象和其他对象的排查。
Heap Viewer不光可以用来检测是否有内存泄漏,对于内存抖动,我们也可以用该工具检测,因为内存抖动的时候,会频繁发生GC,这个时候我们只需要开启Heap Viewer,观察数据的变化,如果发生内存抖动,会观察到数据在段时间内频繁更新。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/itfootball/article/details/48715221