MAT 是一个快速,功能丰富的 Java Heap 分析工具,通过分析 Java 进程的内存快照 HPROF 分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。
ADM
LeakCanary
使用LeakCanary库,打印解析文件的同时并保留了原始Hprof文件。
android_sdk/ 转换hprof文件,获取可解析文件。
leakcanary 产生的日志信息
注:可以看出来由于,匿名内部实现类导致的问题,此处问题也是很多apk经常遇见。
将转换后的.hropf文件导入到MAT,overview(概况)
Thread_Overview: 应用的线程信息.
注:重点关注Histogram和Dominator Tree功能项.
过滤DLoadSelectActivity对象,在Histogram/Dominator过滤获取结果如下:
Histogram
Dominator
获取GC Roots,确认内存泄漏
定位代码
//匿名内部类导致的问题
Instance(mContext).getJson(url, true, params, DownLoadVideoJson.class, Class().getSimpleName(),new NetRequestListener<DownLoadVideoJson>() {@Overridepublic void onSuccess(DownLoadVideoJson response) {copeWithSuccess(response, type);}@Overridepublic void onFailed(String message) {Failed(type , message);}});
解决方案
/*** 自定义NetRequestListener实现类,采用弱引用的方式* @param DownLoadVideoJson*/
static class RequestSupportCountRequestListener implements NetRequestListener<DownLoadVideoJson>{private final WeakReference<DLoadSelectController> mWeakReference;
private int type;public void setType(int type) {pe = type;
}public RequestSupportCountRequestListener(DLoadSelectController dLoadSelectController){mWeakReference = new WeakReference<>(dLoadSelectController);
}@Override
public void onSuccess(DownLoadVideoJson response){DLoadSelectController dLoadSelectController = ();if(null == dLoadSelectController){return;}peWithSuccess(response, type);}@Override
public void onFailed(String message){DLoadSelectController dLoadSelectController = ();if(null == dLoadSelectController){return;}Failed(type , message);}
}
本文发布于:2024-02-04 15:58:51,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170711103656898.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |