Android Studio内存泄漏分析指南

内存泄漏原因

当应用不需要某对象时候,忘记释放分配的内存,该对象仍然保持被引用状态(当对象拥有强引用,GC无法回收),从而导致内存泄漏

一、Context引起的内存泄漏

常见问题:

这个是最常见的,因为Activity经常要用到上下文Context,很有可能Activity作为Context传递给某些类,Activity生命周期结束之后,某些类仍然存活并保持着该Activity的引用,保持引用就无法被回收。从而导致内存泄漏

解决方案:

1、下次如果传入context给某些类的时候,最好是用ApplicationContext,这样可以有效避免内存泄漏

2、在界面销毁的时候,手动释放掉引用过activity的context

二、Static静态变量

常见问题:

我们有时候会为了方便,设置某个Activity或者View为静态变量,但是你要知道,static变量是要贯穿整个应用的生命周期,就是意味着即使Activity销毁,static变量也不会销毁,所以,如果你把View或者Activity设置为静态变量,这会导致当前的Activity会一直存在,从而导致内存泄漏

解决方案:

1、尽量避免使用static变量

2、如果非要使用的话,记得在界面销毁的时候,把静态变量也释放掉,简单说就是把静态变量置空,如staticView=null

三、非静态内部类、匿名内部类持有外部类的引用

常见问题:

我们在使用AsyncTash、Handler,TimerTask、Thread的时候,为了方便,直接new一个匿名内部类对象,殊不知我们在new一个的时候,编译器在编译的时候会自动为内部类的构造方法加上外包类的引用,所以这些匿名内部类会持有Activity,当这些匿名内部类处理非常耗时的操作时候,就算Activity生命周期结束,也不会被销毁,这就会造成内存泄漏

解决方案

1、当Activity销毁的时候,对不需要的匿名内部类进行任务停止操作

2、使用静态内部类,静态内部类内部使用弱引用来引外部类,这样当Activity销毁的时候,弱引用是可以被回收的

四、其他引起的泄漏

1、我们在使用系统服务的时候,比如注册了一些广播监听,在使用完后,要释放掉

2、我们在给View绘制动画的时候,View被动画持有,而Activity又被View持有引用,导致Activity也无法释放。所以在Activity销毁时,调用animator.cancel()来停止动画


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值