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

1.Handler引起的内存泄漏

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

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

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

原因:构建该单例的一个实例时需要传入一个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

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值