注:由于实际开发与参考答案会有所不一样,再者怕误导你们,因此这些面试题答案仍是本身去理解!面试官会针对简历中提到的知识点由浅入深提问,因此不要背答案,多理解。
1.图片的三级缓存中,图片加载到内存中,若是内存快爆了,会发生什么?怎么处理?前端
参考回答:android

若是内存足够时不回收。内存不够时就回收软引用对象面试
2.内存中若是加载一张500*500的png高清图片.应该是占用多少的内存?算法
参考回答:数据库
- 不考虑屏幕比的话:占用内存=500 500 4 = 1000000B ≈ 0.95MB
- 考虑屏幕比的的话:占用内存= 宽度像素 x (inTargetDensity / inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一个像素所占的内存字节大小
- inDensity表示目标图片的dpi(放在哪一个资源文件夹下),inTargetDensity表示目标屏幕的dpi

3.WebView的性能优化 ?后端
参考回答:
一个加载网页的过程当中,native、网络、后端处理、CPU都会参与,各自都有必要的工做和依赖关系;让他们相互并行处理而不是相互阻塞才可让网页加载更快:缓存
- WebView初始化慢,能够在初始化同时先请求数据,让后端和网络不要闲着。
- 经常使用 JS 本地化及延迟加载,使用第三方浏览内核
- 后端处理慢,可让服务器分trunk输出,在后端计算的同时前端也加载网络静态资源。
- 脚本执行慢,就让脚本在最后运行,不阻塞页面解析。
- 同时,合理的预加载、预缓存可让加载速度的瓶颈更小。
- WebView初始化慢,就随时初始化好一个WebView待用。
- DNS和连接慢,想办法复用客户端使用的域名和连接。

4.Bitmap如何处理大图,如一张30M的大图,如何预防OOM?安全
参考回答:避免OOM的问题就须要对大图片的加载进行管理,主要经过缩放来减少图片的内存占用。性能优化
- BitmapFactory提供的加载图片的四类方法(decodeFile、decodeResource、decodeStream、decodeByteArray)都支持BitmapFactory.Options参数,经过inSampleSize参数就能够很方便地对一个图片进行采样缩放
- 好比一张10241024的高清图片来讲。那么它占有的内存为102410244,即4MB,若是inSampleSize为2,那么采样后的图片占用内存只有512512*4,即1MB(注意:根据最新的官方文档指出,inSampleSize的取值应该老是为2的指数,即一、二、四、8等等,若是外界输入不足为2的指数,系统也会默认选择最接近2的指数代替,好比2)
综合考虑。经过采样率便可有效加载图片,流程以下服务器
- 将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片
- 从BitmapFactory.Options中取出图片的原始宽高信息,它们对应outWidth和outHeight参数
- 根据采样率的规则并结合目标View的所需大小计算出采样率inSampleSize
- 将BitmapFactory.Options的inJustDecodeBounds参数设为false,从新加载图片

5.内存回收机制与GC算法(各类算法的优缺点以及应用场景);GC原理时机以及GC对象
参考回答:
内存断定对象可回收有两种机制:
- 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任什么时候刻计数器为0的对象就是不可能再被使用的。然而在主流的Java虚拟机里未选用引用计数算法来管理内存,主要缘由是它难以解决对象之间相互循环引用的问题,因此出现了另外一种对象存活断定算法。
- 可达性分析法:经过一系列被称为『GCRoots』的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证实此对象是不可用的。其中可做为GC Roots的对象:虚拟机栈中引用的对象,主要是指栈帧中的本地变量*、本地方法栈中Native方法引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象
GC回收算法有如下四种:
6.内存泄露和内存溢出的区别 ?AS有什么工具能够检测内存泄露
参考回答:
- 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;好比申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
- 内存泄露(memory leak):是指程序在申请内存后,没法释放已申请的内存空间,一次内存泄露危害能够忽略,但内存泄露堆积后果很严重,不管多少内存,早晚会被占光。memory leak会最终会致使out of memory!
- 查找内存泄漏可使用Android Studio 自带的AndroidProfiler工具或MAT
7.性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?
参考回答:
黑白屏产生缘由:当咱们在启动一个应用时,系统会去检查是否已经存在这样一个进程,若是不存在,系统的服务会先检查startActivity中的intent的信息,而后在去建立进程,最后启动Acitivy,即冷启动。而启动出现白黑屏的问题,就是在这段时间内产生的。系统在绘制页面加载布局以前,首先会初始化窗口(Window),而在进行这一步操做时,系统会根据咱们设置的Theme来指定它的Theme 主题颜色,咱们在Style中的设置就决定了显示的是白屏仍是黑屏。
- windowIsTranslucent和windowNoTitle,将这两个属性都设置成true (会有明显的卡顿体验,不推荐)
- 若是启动页只是是一张图片,那么为启动页专注设置一个新的主题,设置主题的android:windowBackground属性为启动页背景图便可
- 使用layer-list制做一张图片launcher_layer.xml,将其设置为启动页专注主题的背景,并将其设置为启动页布局的背景。
8.强引用置为null,会不会被回收?
参考回答:
不会当即释放对象占用的内存。 若是对象的引用被置为null,只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集器是运行在后台的线程,只有当用户线程运行到安全点(safe point)或者安全区域才会扫描对象引用关系,扫描到对象没有被引用则会标记对象,这时候仍然不会当即释放该对象内存,由于有些对象是可恢复的(在 finalize方法中恢复引用 )。只有肯定了对象没法恢复引用的时候才会清除对象内存。
9.ListView跟RecyclerView的区别
参考回答:
动画区别:
- 在RecyclerView中,内置有许多动画API,例如:notifyItemChanged(), notifyDataInserted(), notifyItemMoved()等等;若是须要自定义动画效果,能够经过实现(RecyclerView.ItemAnimator类)完成自定义动画效果,而后调用RecyclerView.setItemAnimator();
- 可是ListView并无实现动画效果,但咱们能够在Adapter本身实现item的动画效果;
刷新区别:
- ListView中一般刷新数据是用全局刷新notifyDataSetChanged(),这样一来就会很是消耗资源;自己没法实现局部刷新,可是若是要在ListView实现局部刷新,依然是能够实现的,当一个item数据刷新时,咱们能够在Adapter中,实现一个onItemChanged()方法,在方法里面获取到这个item的position(能够经过getFirstVisiblePosition()),而后调用getView()方法来刷新这个item的数据;
- RecyclerView中能够实现局部刷新,例如:notifyItemChanged();
缓存区别:
- RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持全部RecyclerView共用同一个RecyclerViewPool(缓存池)。
- ListView和RecyclerView缓存机制基本一致,但缓存使用不一样
10.ListView的adapter是什么adapter
参考回答:

- BaseAdapter:抽象类,实际开发中咱们会继承这个类而且重写相关方法,用得最多的一个适配器!
- ArrayAdapter:支持泛型操做,最简单的一个适配器,只能展示一行文字〜
- SimpleAdapter:一样具备良好扩展性的一个适配器,能够自定义多种效果!
- SimpleCursorAdapter:用于显示简单文本类型的listView,通常在数据库那里会用到,不过有点过期,不推荐使用!
11.LinearLayout、FrameLayout、RelativeLayout性能对比,为何?
参考回答:
- RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子 View 2次onMeasure
- RelativeLayout的子View若是高度和RelativeLayout不一样,则会引起效率问题,当子View很复杂时,这个问题会更加严重。若是能够,尽可能使用padding代替margin。
- 在不影响层级深度的状况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
到此性能优化篇就完了,若是须要更多面试资料和更多Android知识的能够加个人
QQ合做群:925019412