Android中常出现内存泄漏的情况
来源:互联网 发布:实况8李惠堂数据 编辑:程序博客网 时间:2024/05/17 10:08
1. 有“static”变量引用待释放类实例
示例代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
内存泄漏分析
执行一次跳转到StaticReferenceActivity界面并退出。执行onDestroy()方法,则该界面被销毁。 StaticReferenceActivity界面被销毁,则它对应用程序不再有用。它所占用的的资源,应该被释放。但是StaticReferenceActivity不能被垃圾回收的原因,有名为sStaticReferenceActivity的变量引用着StaticReferenceActivity的实例。查看程序,我们发现sStaticReferenceActivity是一个静态变量。我们知道静态变量会被存储在静态存储区中,而静态存储区中的数据在应用程序运行时一直存在。
很多朋友在编写Java程序时,为了方便喜欢使用静态变量,它虽然方便,但使用不当确容易产生内存泄漏,所以本人建议,合理进行程序设计,尽量少用static变量。
2.使用“Handler”向“MessageQueue”中添加需要等待的任务
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
HandlerActivity 不能被垃圾回收的原因,有名为mMessageQueue的变量引用着HandlerActivity 的实例。查看示例代码,我们发现我们用Handler向MessageQueue中加入了一个任务,但该任务要延迟5分钟才能执行,所以在改任务未被处理前,它将一直持有HandlerActivity的实例。导致HandlerActivity界面退出后,其占用内存不能被立即释放掉。所以要在退出HandlerActivity界面时,将任务移出MessageQueue。
处理内存泄漏的代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
示例程序所表现的问题并不严重,因为等待5分钟后,这部分内存依旧可以释放掉。但如果使用Handler实现了循环定时器,如果在不使用后,忘记将任务从MessageQueue中移出,那这部分内存在程序运行期间将永不会被释放。
3.对需要进行注册的对象,进行了“注册”,但未进行“反注册”
使用方法EventBus.getDefault().register(this);将EventBusActivity的实例注册到了EventBus,但在EventBusActivity退出时却未进行反注册。
解决该种内存泄漏,只需在onDestroy()方法中,调用EventBus.getDefault().unregister(this);进行反注册。
4.“单例”中持有了待释放对象的引用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
InstanceActivity 不能被垃圾回收的原因,在Instance实例中,有名为mContext的引用。查看示例代码,我们发现我们用InstanceActivity的实例初始化了Instance单例。我们知道单例对象是在应用程序运行时一直存在的。所以导致InstanceActivity对象不能释放。
这种内存泄漏的解决方法是,不要用待释放对象去初始化单例对象,单例对象最好使用ApplicationContext去初始化。所以示例程序内存泄漏的解决方法,将Instance.getInstance(this);改为Instance.getInstance(this.getApplicationContext());。
5.具有销毁方法的“资源”在使用完后,没有调用相应方法对资源进行销毁
解决该中内存泄漏的方法,在不使用资源时,调用资源的销毁方法,对其进行清理和销毁。
6.内部类”和“匿名内部类”中有外部类的引用,由于它们被引用导致外部类对象不能被释放
我们知道内部类和匿名内部类中持有外部类的引用,所以内部类的实例不能释放,将导致外部类的实例不能释放,发生内存泄漏。
- Android中常出现内存泄漏的情况
- Android中常出现内存泄漏的情况
- Android中常出现内存泄漏的情况
- Android中常出现的内存泄漏情况分析
- Android内存泄漏的情况
- log4cpp 内存泄漏的一个出现情况
- android中常出现的内存泄露问题
- Android内存泄漏的可能情况
- 内存泄漏的情况
- 可能出现内存泄漏的几种情况
- android 内存泄漏情况大全
- Android开发中常见的内存泄漏情况和解决办法
- Android中内存泄漏的几种情况
- Android中的内存泄漏情况分析
- android对接unity时出现的内存泄漏问题
- Android 的内存泄漏
- 内存泄漏的几种情况
- 内存泄漏的几种情况
- Oracle权限管理详解
- Tomcat指定JDK版本
- three.js加载纹理
- MongoDB应用案例:使用 MongoDB 存储日志数据
- mongodb系列02-------深入理解索引原理
- Android中常出现内存泄漏的情况
- 论文笔记 | Densely Connected Convolutional Networks
- APP测试要点
- MySQL分库分表总结参考
- “云计算”随笔(一)
- Jmeter启动报错找不到KeyTool插件
- IntelliJ IDEA使用教程 (总目录篇)
- AC的故事大结局悲剧版(下) 主席树模板,区间修改
- 从理论到实践,手把手教你如何用 TensorFlow 实现 CNN