MAT-实用篇

1. 简介

MAT 是一个快速,功能丰富的 Java Heap 分析工具,通过分析 Java 进程的内存快照 HPROF 分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。

2. 获取Hprof文件
  • ADM

    这里写图片描述

  • LeakCanary

    使用LeakCanary库,打印解析文件的同时并保留了原始Hprof文件。

3. 转换成标准的hprof文件

android_sdk/platform-tools/hprof-conv.exe 转换hprof文件,获取可解析文件。

4. hprof文件分析此处拿leakcanary生成的源文件为例
  • leakcanary 产生的日志信息

    这里写图片描述

    注:可以看出来由于,匿名内部实现类导致的问题,此处问题也是很多apk经常遇见。

  • 将转换后的.hropf文件导入到MAT,overview(概况)

    这里写图片描述

    • Histogram:列出内存中的对象,对象的个数以及大小.
    • Dominator Tree:列出最大的对象以及其依赖存活的Object (大小是以Retained Heap为标准排序的).
    • Top Consumers:通过图形列出最大的object.
    • Thread_Overview: 应用的线程信息.

    • 注:重点关注Histogram和Dominator Tree功能项.

  • 过滤DLoadSelectActivity对象,在Histogram/Dominator过滤获取结果如下:

    • Histogram

      这里写图片描述

      • Objects:对象个数.
      • shallow size:对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和.
      • retained size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和.
    • Dominator

      这里写图片描述

  • 获取GC Roots,确认内存泄漏

    这里写图片描述

  • 定位代码

    //匿名内部类导致的问题
    NetWorkRequest.getInstance(mContext).getJson(url, true, params, DownLoadVideoJson.class, mContext.getClass().getSimpleName(),new NetRequestListener<DownLoadVideoJson>() {
      @Override
      public void onSuccess(DownLoadVideoJson response) {
        copeWithSuccess(response, type);
      }
    
      @Override
      public void onFailed(String message) {
         mOnDLoadSelectListener.onFailed(type , message);
      }
      });
    
  • 解决方案

     /**
     * 自定义NetRequestListener实现类,采用弱引用的方式
     * @param DownLoadVideoJson
     */
    static class RequestSupportCountRequestListener implements NetRequestListener<DownLoadVideoJson>{
    
    private final WeakReference<DLoadSelectController> mWeakReference;
    private int type;
    
    public void setType(int type) {
        this.type = type;
    }
    
    public RequestSupportCountRequestListener(DLoadSelectController dLoadSelectController){
        mWeakReference = new WeakReference<>(dLoadSelectController);
    }
    
    @Override
    public void onSuccess(DownLoadVideoJson response){
        DLoadSelectController dLoadSelectController = mWeakReference.get();
    
        if(null == dLoadSelectController){
            return;
        }
    
        dLoadSelectController.copeWithSuccess(response, type);
    
    }
    
    @Override
    public void onFailed(String message){
    
        DLoadSelectController dLoadSelectController = mWeakReference.get();
    
        if(null == dLoadSelectController){
            return;
        }
    
        dLoadSelectController.mOnDLoadSelectListener.onFailed(type , message);
    
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值