美文网首页
MT的使用

MT的使用

作者: 董成鹏 | 来源:发表于2018-12-07 11:40 被阅读0次
    1. sdk/tools/lib下面找到对应的Device Monitor,然后启动
    2. 左侧面板选中要调试的进程,点击update heap按钮,然后点击右侧的Cause gc按钮触发一次GC
    3. 各种操作之后,点击Dump HPROF file按钮,把dump文件保存为android.hprof
    4. sdk/platform-tools中使用 hprof-conv android.hprof mat.hprof
    5. 使用MAT打开mat.prof

    MAT官方中文教程

    记下来就是使用MAT查找内存泄露的一般套路了。
    使用MAT工具必须牢记两个概念:Shallow Heap和Retained Heap.
    Shallow Heap是某个对象自身占用的内存。
    Retained Heap是释放掉这个对象可以回收的内存,比如A->B,B->C,释放掉A会导致B和C都被释放掉,那么Retained Heap就是A,B,C内存之和

    还有就是incoming reference表明这个object被其他object引用的情况。
    outcoming reference表示这个object引用其他object的情况。

    在每次点击右键的时候,几乎都有一个选项叫做search queries,这个会提供各个选项的一些说明。

    使用注意事项

    1. 饼状图是按照Retained Size展示的.
      2.一般展示的String,数组占用的内存虽然比较大,但是一般不是内存泄露的地方
    2. 要关注Retained Heap,它的真实含义是这个Object被回收时可以释放的内存。
    3. 理解Dominator Tree. 说Object A是Object B的Dominator,意味着每一条(我觉得不是每一条,是有一条)通往Object B的GC Path都要通过A.这个是我们用来发下内存泄漏引用关系链最重要的地方。

    在生成的泄露怀疑报告里面, 也就是suspects这个这个报表中,打开一个怀疑点, 会有一个叫Shortest Path To the Accumulation Point,就是从GC root到这个内存消耗集聚点的最短路径, 如果有这条引用, 就有很大概率泄露了。

    还有就是我们在Histogram图中, 选择list object时候, 右侧的Inspector面板会出现我们选择的这个对象的所有属性,我们比较关心的是最后一条, 是否有GC Root, 如果是No GC Root说明肯定没有内存泄露, 有过有GC Root说明可能有内存泄露。

    MAT可以导入两个hprof进行对比分析(生成的两个hprof文件必须没进程重启,否则无效), 在对比hprof的时候,一般都是通过package分类,因为如果分类太细的话, 会对我们造成很大困扰。 在对比的时候, 我们只看自己的包, 不看系统的包。 对比会显示当前的hprof和对比的hprof相比, 这个包下哪个类的实例增加了多少或者减少了多少,这对于我们进行排查很重要。

    相关文章

      网友评论

          本文标题:MT的使用

          本文链接:https://www.haomeiwen.com/subject/nwaqgftx.html