zoukankan      html  css  js  c++  java
  • MAT使用

    一.简介

    Eclipse提供的一个内存分析工具。它是一个功能丰富的 Java 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗。 Androidstudio未集成该插件,需要你下载独立版。 
    android studio的DDMS可以生成hprof是什么文件,不过需要进行一下格式转化(.hprof文件从Dalvik格式转换成J2SE HPROF格式),才可以导入MAT独立版软件。

    可以做什么?

    导入hprof文件,帮助我们进行堆转储文件分析,分析内存泄漏和大对象,可以帮助你发现内存漏洞和减少内存消耗。

    二.使用流程

    程序运行内存对情况——程序运行堆内存分配情况快照(ddms可以得到,文件格式为hprof)——使用MAT分析该文件——判断是否出现内存泄露——修改程序

    分析流程:

    通常我们都会采用下面的“三步曲”来分析内存泄露问题:

    首先,对问题发生时刻的系统内存状态获取一个整体印象。

    第二步,找到最有可能导致内存泄露的元凶,通常也就是消耗内存最多的对象

    接下来,进一步去查看这个内存消耗大户的具体情况,看看是否有什么异常的行为。

    内存问题的分析, 无外乎分析对象的内存占用(Retained Size), 找出Retained Size大的对象, 找到其直接支配(Immediate Dominator), 跟踪其GC可达路径(Path to GC Roots), 从而找到是谁让这个大对象活着. 找到问题症结, 对症下药.

    http://www.lightskystreet.com/2015/09/01/mat_usage/ 
    这篇文章涉及一些分析流程,总结的很不错。

    三.工作台

    1.histogram(直方图,柱状图)

    histogram视图主要是查看某个类的实例个数,比如我们在检查内存泄漏时候,要判断是否频繁创建了对象,就可以来看对象的个数来看。也可以通过排序看出占用内存大的对象:

    默认是类名形式展示,你也可以选择不同的显示方式,有以下四种方式:

    以下文章中有这个的实践 
    https://juejin.im/post/58eb814aac502e4957ce3073

    2.dominator tree(内存里占用内存最多的对象列表)

    该视图会以占用总内存的百分比来列举所有实例对象,注意这个地方是对象而不是类了,这个视图是用来发现大内存对象的。这些对象都可以展开查看更详细的信息,可以看到该对象内部包含的对象:

    默认是类名形式展示,你也可以选择不同的显示方式,有以下四种方式:

    • Shallo Heap:对象本身占用内存的大小,不包含其引用的对象内存。

    • Retained Heap: Retained heap值的计算方式是将retained set中的所有对象大小叠加。或者说,由于X被释放,导致其它所有被释放对象(包括被递归释放的)所占的heap大小。

    通过List objects->with incoming references查看(这里with incoming references表示查看谁引用了这个对象,with outgoing references表示这个对象引用了谁)

    with incoming references 将列出哪些类引入该类; 
    with outgoing references 列出该类引用了哪些类

    腾讯下面的文章有介绍它的实践,主要基于dominator tree。

    Android 内存优化总结&实践 
    https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ

    leakcanary原理分析与AppsFly内存泄漏 
    http://www.voidcn.com/blog/ahong222/article/p-6171643.html

    定位bitmap后,怎么看出是哪张图片? 
    http://androidperformance.com/2015/04/11/AndroidMemory-Open-Bitmap-Object-In-MAT.html 
    http://hoo.tips/2017/04/08/841651a1/

    3.duplicate class(重复类)

    4.leak suspects(泄漏嫌疑)

    这个视图会展示一些可能的内存泄漏的点.

    5.top components(top 成分)

    Top consumers通过图形列出最大的object。

    6.使用OQL查询相关对象

    对于Android App开发来说, 大部分的内存问题都跟四大组件, 尤其是Activity相关, 故而我们会想查出所有Activity实例的内存占用情况, 可以使用OQL来查询:

    四.实践

    见以上

    五.参考资料

    使用 Eclipse Memory Analyzer 进行堆转储文件分析 
    https://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html

    内存泄露实例分析 – Android内存优化第四弹 
    http://blog.lmj.wiki/2016/10/31/app-opti/app_opt_mem_leak/

    Android内存优化之三:打开MAT中的Bitmap原图 
    http://androidperformance.com/2015/04/11/AndroidMemory-Open-Bitmap-Object-In-MAT.html

    Android 性能优化之内存泄漏检测以及内存优化(中) 
    https://juejin.im/post/58eb814aac502e4957ce3073

    MAT使用教程 
    http://blog.csdn.net/itomge/article/details/48719527

    MAT - Memory Analyzer Tool 使用进阶 
    http://www.lightskystreet.com/2015/09/01/mat_usage/

    之前自己的一篇文章: android内存泄露分析工具MAT详解 
    http://blog.csdn.net/a910626/article/details/50760948

    Android性能专项测试之MAT 

    http://www.woaipu.com/shops/zuzhuan/61406
    http://www.znds.com/tv-967956-1-1.html
    http://www.znds.com/tv-967958-1-1.html

    http://www.woaipu.com/shops/zuzhuan/61406
    http://www.znds.com/tv-967956-1-1.html
    http://www.znds.com/tv-967958-1-1.html

     

  • 相关阅读:
    十九:数字排重
    十八:十六进制转八进制
    Dubbo Notes
    Concurrent Package
    MySQL(8.0)官方文档阅读笔记
    MyBatis笔记
    分布式事务
    RabbitMQ笔记
    Kafka官方文档阅读笔记
    Cassandra Note
  • 原文地址:https://www.cnblogs.com/sy646et/p/7197958.html
Copyright © 2011-2022 走看看