Android 内存泄露

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

长生命周期持有短生命周期对象引用,尽管短生命周期对象已经没有使用,但长生命周期一直持有短生命周期引用而导致不能回收,则导致内存泄露。

今天想去婆婆家玩,我有一个大背包,我要装我的玩具。看到玩具熊我可能拿出来玩,放到背包里。接着看到模型,这个会拿出来但不知道会玩不,先装进去吧。背包鼓鼓了,突然看到最最爱的挖挖机了,我肯定会玩这个,发现无法装入了,目前我装这个两个玩具都非常重了。于是儿子去拿了便利贴,上面有绿色,黄色,红色,分别表示喜欢程度红是最喜欢,玩具熊贴了绿色,模型贴了黄色,挖挖机提了红色,儿子发现背包装不下了会把贴有绿的玩具熊拿出来,再装挖挖机。我想整理下背包,我只带一定会玩的玩具去,然后取出贴有黄色标签模型。

背包没有容量且很重,玩具熊对儿子来说,可能都不会拿出来占用空间,最后导致内存泄露。但儿子很聪明对玩具标记了颜色,发现不能装,取出带有绿色玩具熊(软引用 SoftReference内存不够都被回收),检查背包黄色标签标示(弱引用WeakReference 扫描管辖内存时)

常见内存溢出:

  • 单例模式,单例往往生命周期都是整个应用生命周期,如果持有短生命周期容易出现内存泄漏,如Activity

  • 静态变量,和application一样生命周期,需要我们评估占据空间大小

  • handler持有短生命周期,特别是匿名内部内,messagequeue持有,looper持有前者

  • 匿名内部类持有外部类对象,如activity里面的内部类,如果匿名内部类做耗时是,无法释放外部对象

  • 资源泄漏,数据库没有关闭,文件没有关闭,bitmap没有释放

  • 最好是实现onDestory,把需要解绑注册的广播解绑

  • 第三库传递一定是applicant的context

  • 容器你装了fragment或者view,activity持有容器对象,最好在activity销毁是clear,不要等待垃圾回收器。

使用leakcanary+MAT工具检查内存

开发时一定注意在activity被fragment释放资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容