【吐血整理】Android开发社招面试解答之性能优化,吊打面试官系列!
正文
从我个人的角度写写30多岁码工的感受:的确是受年龄压力开始增大了。比如二十多岁的小年轻,可能什么都懂,对组里的东西很熟悉。有时候我也怀疑自己是不是智商不够,是不是自学能力太差,是不是基础不行,别人是不是都玩命加班,你知道30多岁的人那种危机感。
内存泄漏是什么?
内存泄漏即 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
- 使用缓存的
最后
希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。可以点击Gitee免费获取