Android 监听查找内存泄漏 配合Mat工具

1、Android Studio Profiler查看内存

内部培训做个记录

运行我们的项目,然后一直玩APP。最后在Android Studio Profiler中选择memory。执行如下操作:

会得到如下图示。

从图中可以看出,目前存在47个泄漏情况。点击数字47 会得到app heap内存泄漏的详细类。

某一个类泄漏了17次。

右键到处hprof文件。

2、hprof文件转换

进入到Android SDK的platform-tools目录下 执行如下命令

hprof-conv memory.hprof 11.hprof

3、MAT定位泄漏原因

打开mat软件,选择file 导入刚刚生成的11.hprof文件

点击

输入你需要查看的泄漏类的正则

这儿我输入activity。找到我们自己的activity,这个时候右键该类。选择Gc roots 然后exclude all phantom/weak/soft etc.references(这步操作的目的是排除软弱虚引用,因为我们知道内存泄漏的问题都是由强引用导致的)

 

从图中可以看出 我们项目有个lifecycleRegister类持有了activity保存在fragmentCallback中,而得不到释放。

4、回到代码排查原因

最后在代码中我看到我们的fragmentCallback一直保存数据,但是没有地方释放,在释放的位置activity.finish()即可。至此解决问题

即堆中存在不再使用的对象,但垃圾收集器无法将它们从内存中删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,内存泄漏是一种常见的问题,它指的是应用程序中的对象占用了内存,但无法被垃圾回收器释放,导致内存的持续增加,最终可能导致应用程序崩溃或性能下降。以下是一些常见的Android内存泄漏情况和预防方法: 1. 静态引用:使用静态变量持有对象的引用可能导致内存泄漏。解决方法是使用弱引用(WeakReference)来持有对象引用,使其能够被垃圾回收器回收。 2. 上下文泄漏:在Android中,如果持有Activity或Context的引用,而没有及时释放,就会导致Activity无法被回收,从而引发内存泄漏。解决方法是在不再需要使用上下文的地方及时释放引用,避免长时间持有上下文。 3. 长时间运行的线程:如果一个线程持有Activity的引用并且没有正确地停止或销毁,就会导致Activity无法被回收。解决方法是在Activity销毁时停止线程或使用生命周期感知组件(如ViewModel)来管理线程。 4. 注册监听器和回调:如果在Activity或Fragment中注册了监听器或回调,并且没有及时取消注册,就会导致Activity或Fragment无法被回收。解决方法是在不再需要使用监听器或回调的地方及时取消注册。 5. 非静态内部类:非静态内部类会持有外部类的引用,如果非静态内部类的生命周期比外部类长,就会导致外部类无法被回收。解决方法是将非静态内部类声明为静态内部类,或使用弱引用来持有外部类的引用。 6. Bitmap处理:Bitmap对象在Android中占用大量内存,如果不及时回收或缩小Bitmap的尺寸,就可能导致内存泄漏。解决方法是及时回收不再使用的Bitmap对象,并使用适当的缩放算法来减小Bitmap的尺寸。 7. 使用工具检测:可以使用工具来检测和分析应用程序中的内存泄漏问题,例如Android Profiler、LeakCanary等工具可以帮助开发者找到内存泄漏的源头。 总之,要避免Android应用程序中的内存泄漏问题,开发者应该注意及时释放对象引用、正确管理上下文、停止长时间运行的线程、取消注册监听器和回调等。同时,使用工具进行检测和分析也是预防内存泄漏的有效方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值