android 内存泄漏详解

内存泄漏 : 程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果(百科)。

常见内存泄漏及解决办法 : 

1 . Context 引用不当

避免生命周期较长的对象引用生命周期较短的Context,如:Service的生命周期不依赖于Activity,所以启动Service可以通过ApplicationContext.

2 . 对Context的静态引用

每一个View都包含一个对Context的引用,如果保持一个对View的静态引用,当配置发生改变(如屏幕旋转),Activity将得不到回收。

3 . 结束服务

当不需要的时候即时的结束Service:如当使用完google地位服务后,应当调用googleApiClient.disconect()进行关闭。

4 . 资源回收

图片往往是导致OOM的主要原因,不用的资源应当及时回收。

5 . 注销广播

手动注册的广播,在适当的时候(如:Activity.onDestroy()时)及时注销。

6 . 无限循环动画未关闭,导致Activity无法被回收

7 . 匿名内名回调接口 ,导致Activity无法被回收

每次创建一个匿名类,它会持有一个对上层类的引用。所以尽量避免匿名内部类,并及时注销。

8 . 注册监听导致的Activity无法回收(观察模式)

当在Activity实现或者创建一个接口时,如果注册监听的对象的生命周期大于Activity的生命周期,会导致Activity无法及时回收。

alt1 : 及时注销接口

alt2 : 使用WeakReference

9 .  使用AsyncTask时,持有Activity(Fragment)的强引用,导致Activity无法被回收。

10 . 使用内名Runnable执行任务,在任务结束之前退出Activity,导致Activity无法被回收。

11 . 在Activity销毁时,取消Handler和Timer


使用 LeakCanary检测内存溢出,使用MAT分析内存使用情况。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值