admin管理员组文章数量:1794759
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>() {@Overridepublic void onSuccess(DownLoadVideoJson response) {copeWithSuccess(response, type);}@Overridepublic 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);} }
本文标签: mat
版权声明:本文标题:MAT 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1731043356a969442.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论