用mat工具分析Android泄漏解决问题

内存泄漏是Android开发中比较难以解决的问题。这篇文章主要是来探讨如何使用mat工具进行内存泄漏的排查

1.leakcanary上提示报错,发现有内存泄漏的提示

2.打开Androidstudio 的Profile工具.菜单View-》ToolWindow-》Profiler (我本地的android studio版本是3.4),运行程序app

3.在出现问题的页面来回切换

4.点击Profiler的gc

5.Dump java heap 

6.在下方的Head Dump里面选择 app heap 然后 arrange by package 输入自己项目的包名

发现SecondActivity的Allocations数量竟然等于7!说明存在SecondActivity的内存泄漏,使得SecondActivity的实例不被回收

7.Export Heap Dump到指定目录,是一个后缀为.hprof格式的文件。

然后从官网上下载MAT(一款eclipse下面的内存分析工具),具体网址:https://www.eclipse.org/mat/downloads.php

mat工具下载好以后在mac环境下面报以下错误:

不要怕,解决方案如下:

https://blog.csdn.net/EaskShark/article/details/82664473

8.终于能正确打开MAT工具了,导入刚才我们的dump 文件。这时候发现还是会报错,因为我们的hprof文件从AndroidStudio里面导出来以后还要进行格式上的转换。

刚开始导入的时候会报错,这时候需要将dump进行转换,找到Androidsdk目录下platform-tools文件夹,里面有个hprof-conv工具,使用这个工具将dump文件转化为mat支持打开的格式。

hprof-conv 1.hprof 2.hprof

然后再用mat成功打开dump文件后,选择Histogram选项卡

9.在上图的红框处输入过滤条件,这里我们可以选择我们发生内存泄漏的类名

 

选择排除任何 软引用、虚引用等

10.

typesBySubscriber是EventBus的内部成员,这个可以EventBus里面的源码可以看到

public class EventBus {

    /** Log tag, apps may override it. */
    public static String TAG = "EventBus";

    static volatile EventBus defaultInstance;

    private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
    private static final Map<Class<?>, List<Class<?>>> eventTypesCache = new HashMap<>();

    private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
    private final Map<Object, List<Class<?>>> typesBySubscriber;
    private final Map<Class<?>, Object> stickyEvents;

这个可以从EventBus的源码可以知道,typesBySubscriber是在构造器里面赋值,然后在register方法里面添加内容,在unregister方法里面清空内容。所以造成内存泄漏的原因就是EventBus的unregister方法没有正确调用。具体可以到代码里面排查下EventBus的unregister方法有没有正确调用即可。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值