为了账号安全,请及时绑定邮箱和手机立即绑定

Android中常见的内存泄漏及解决

标签:
Android

1.Handler引起的内存泄漏

原因:该线程持有Handler的引用,而Handler也持有Activity的引用,这就导致了Activity不再使用时,GC回收不了Activity

解决:Handler持有的引用最好使用弱引用,在Activity被释放的时候要记得清空Message,取消Handler对象的Runnable



2.单例模式引起的内存泄漏

我还没见过所谓的单例模式,去网上查了一下,找到了个比较好的范例:


单例模式的目的是使得类的一个对象成为系统中的唯一实例,这样做有什么意义呢?我觉得意义就在于节约内存。举个例子,任务管理器只能存在一个,如果多个任务管理器共存,显示的东西都是一模一样的,存在了多个只能导致过多的内存占用

原因:构建该单例的一个实例时需要传入一个Context,如果此时传入的是Activity,由于Context会被创建的实例一直持有,当Activity进入后台或者开启设置里面的不保留活动时,Activity会被销毁,但是单例持有它的Context引用,Activity没法销毁

解决:对于生命周期比Activity长的对象,要避免直接引用Activity的context,可以考虑使用ApplicationContext


3.非静态内部类创建静态实例引起的内存泄漏

原因:非静态的内部类会自动持有外部类的引用,创建的静态实例就会一直持有的引用

解决:可以考虑把内部类声明为静态的


4.非静态匿名内部类引起的内存泄漏

原因:如果匿名内部类被异步线程使用,可能会引起内存泄漏

解决:可以考虑把内部类声明为静态的


5.资源对象没有关闭引起的内存泄漏

原因:资源性对象比如Cursor、File、Bitmap、视频等,系统都用了一些缓冲技术,在使用这些资源之后没有关闭

解决:处理完资源对象的逻辑记得关闭,最好是形成习惯现写一开一关


6.集合对象没有及时清理引起的内存泄漏

原因:如果集合是static、不断的往里面添加东西、又忘记去清理,肯定会引起内存泄漏

解决:集合里面的东西、有加入就应该对应有相应的删除


顺带一提,垃圾回收不能解决内存泄露



作者:牛板腩天下第一
链接:https://www.jianshu.com/p/ed6b9bc22411
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消