内存泄漏

内存泄漏:  检测工具---leakcanary
    ① yi匿名类和非静态内部类相同,会持有外部类对象

1、单例模式造成的内存泄漏
由于单例的特性使得单例的生命周期和应用的生命周期一样长。如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,导致内存泄漏

2、Handler造成的内存泄漏
这种创建Handler的方式会造成内存泄漏,由于mHandler是Handler的非静态匿名内部类的实例,持有外部类Activity的引用。消息队列是在一个Looper线程中不断轮询处理消息,如果当前Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,而mHandler又持有Activity的引用,导致Activity的内存资源无法回收,引发内存泄漏。

3、线程造成的内存泄漏Thread  (AsyncTask与之类似)
Runnable是一个匿名内部类,因此它们对当前Activity都有一个隐式引用。如果Activity在销毁之前,任务还未完成, 那么将导致Activity的内存资源无法回收,造成内存泄漏。

4、非静态内部类造成的内存泄漏
静态内部类默认会持有外部类的引用,

② 创建静态的实例
静态实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收,造成内存泄漏。
静态变量存储在方法区,它的生命周期从类加载开始,到整个进程结束。一旦静态变量初始化后,它所持有的引用只有等到进程结束才会释放。

③ 资源未关闭造成的内存泄漏
BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏

④ 监听器没有注销造成的内存泄漏
在Android程序里面存在很多需要register与unregister的监听器,我们需要确保及时unregister监听器。


⑤ 集合中的内存泄漏
我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时, 
并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了
所以要在退出程序之前,将集合里的东西clear,然后置为null,再退出程序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值