
笔者双非末流渣渣一本毕业,工作已有6年多。年前从一家小公司CTO离职。准备年后“金三银四”换个更大的舞台。
疫情爆发,市场经济遭到沉重打击,大批企业裁员,整个三月都居家隔离。期间,阿里第一次电话面,未通过。
四月,海投大厂简历,积累面试经验,鹅厂视频面试,未通过;熊厂视频面试,未通过;阿里第二次电话面。未通过。
五月初,阿里第三次电话面通过,转视频初试,通过。出发杭州。
内存泄漏即 ML (Memory Leak) 指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象
内存泄漏的原因归根到底就是当需要被回收变量的内存被其他变量引用持有,导致内存回收失败
常见的原因有:
1.非静态内部类/匿名类原因1:非静态内部类/匿名类 Handler持有外部的Activity/Fragment对象的引用,导致Activity/Fragemnt被销毁的时候没有被回收
解决方案:
将Handler类改为静态内部类 + 弱引用(WeakReference)持有Activity引用(静态类默认不持有外部的引用)当外部类(一般是Activity/Fragment)结束生命周期时,清空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 最后本文在开源项目腾讯文档已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
目前已经更新的部分资料,需要的自取:
@H_301_252@
546431623)]
[外链图片转存中…(img-Z93pcvv1-1618546431625)]
[外链图片转存中…(img-VGLjnYjM-1618546431628)]
以上是内存溢出为你收集整理的2021最新Android知识体系总结,3面直接拿到offer全部内容,希望文章能够帮你解决2021最新Android知识体系总结,3面直接拿到offer所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)