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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
共同学习,写下你的评论
评论加载中...
作者其他优质文章