内存泄漏是什么?
内存泄漏即 ML (Memory Leak)
指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象
内存泄漏有哪些情况,对应的解决方案?
内存泄漏的原因归根到底就是当需要被回收变量的内存被其他变量引用持有,导致内存回收失败
常见的原因有:
1.非静态内部类/匿名类
-
原因1:
非静态内部类/匿名类 Handler
持有外部的Activity/Fragment
对象的引用,导致Activity/Fragemnt
被销毁的时候没有被回收 -
解决方案:
- 将Handler类改为静态内部类 + 弱引用(
WeakReference
)持有Activity
引用(静态类默认不持有外部的引用) - 当外部类(一般是
Activity/Fragment
)结束生命周期时,清空Handler队列
- 将Handler类改为静态内部类 + 弱引用(
-
原因2:
非静态内部类的实例(对象)
=静态实例
(其生命周期 = 应用的生命周期) -
解决方案:
- 将该类改为静态类(静态类默认不持有外部的引用)
- 将该类抽出来封装成为一个单例
-
原因3:多线程 工作线程正在处理任务时外部类需要销毁,此时工作线程持有外部类的引用导致无法被回收
-
解决方案:
- 将该线程类类改为静态类(静态类默认不持有外部的引用)
- 当外部类结束生命周期时强制结束线程
2.集合类
-
原因:集合类添加元素之后持有集合元素的引用,导致该集合元素不可被回收,导致内存泄漏
-
解决方案:
- 集合类使用完元素对象后,必须将该元素从集合中删除(由于一个集合中有多个元素,所以最简单的方案就是清空集合对象(clean)&设置为Null)
3.资源对象使用后未关闭
-
原因:资源对象使用后未关闭,在Activity/Fragemnt销毁时没有关闭/注销这些资源,将导致无法回收 例如:
广播BraodcastReceiver
、文件流Fire
、图片资源Bitmap
、数据库游标
等 -
解决方案:
Activity
销毁时及时关闭/注销资源
4.Static关键字修饰成员变量
-
原因:Static关键字修饰成员变量的生命周期 = 应用的生命周期 例如
private static Context mContext = context
那么context上下文对应的Activity
则无法被回收 -
解决方案:
- 尽量不要使用Static成员变量引用,使用弱引用代替强引用
- 使用单例模式
4.其他使用
-
原因1:Context:当拥有
Activity context
的引用的对象仍在使用,则该Activity
需要销毁时无法回收 -
解决方案:
- 对
context
的引用不要超过它的生命周期 - 使用
ApplicationContext
代替
- 对
-
原因2:WebView:不再使用WebView对象后没有及时销毁,导致内存占用
-
解决方案:
- 通过多线程对不再使用的
WebView
对象进行销毁
- 通过多线程对不再使用的
-
原因3:Adapter:滑动ListView、RecycleView获取新View时 都在getView()中重新实例化一个View对象,浪费资源,使内存占用越来越大
-
解决方案:
- 使用缓存的
convertView
- 直接使用
ViewHolder
- 使用缓存的
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
小结
有了这么多优秀的开发工具,可以做出更高质量的Android应用。
当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。
在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**