程序员,近年来十分火爆的职业,凭着巨大的市场缺口和高额的薪水吸引着大量毕业生加入程序员的队伍。这其中就包括各类专业的学生,像我这种自动化专业的也在其内。这些不是计算机科班出身的可以看作是半路出家了。那么半路出家程序员和计算机专业出身学生有什么区别呢?
先来看一张计算机专业的大学课程表:数据结构与算法、计算机组成原理、汇编语言程序设计、Java语言程序设计、C/C++程序设计、 *** 作系统、计算机系统结构、数据库系统原理、网络编程与计算技术、软件工程、计算机网络、软件开发方法等。
惭愧的说,就上过一门c语言程序设计。毕业找工作也是靠自学编程,然后牛客网(巨牛刷题网站)刷题,看某些面试宝典,做一些小项目才搞定一份工作。像面试某个知名公司时候,当场手写链表逆序程序,以及IP地址的划分规则,感觉是当场就被秒了。既然认识到差距,总是要弥补的。结合自己的学习过程总结了以下几方面。
内存泄漏是什么?内存泄漏即 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
最后由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 pdf文件,需要的小伙伴可以私信我【面试】免费领取或者点击GitHub免费获取!
总结以上是内存溢出为你收集整理的字节跳动技术总监自爆:2021京东最新Android面试真题解析,系列篇全部内容,希望文章能够帮你解决字节跳动技术总监自爆:2021京东最新Android面试真题解析,系列篇所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)