android 内存泄漏详解

来源:互联网 发布:百度云盘网络异常1解决 编辑:程序博客网 时间:2024/06/05 09:02

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

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

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分析内存使用情况。





原创粉丝点击