由于现实开发与参考答案会有所差别,再者怕误导人人,所以这些面试题答案照样自身去明白!面试官会针对简历中提到的知识点由浅入深发问,所以不要背答案,多明白。
1、图片的三级缓存中,图片加载到内存中,假如内存快爆了,会发作什么?怎样处置惩罚?
参考回覆:
起首我们要清晰图片的三级缓存是怎样的
假如内存充足时不接纳。内存不够时就接纳软援用对象
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,那末采样后的图片占用内存只要5125124,即1MB(注重:依据最新的官方文档指出,inSampleSize的取值应当老是为2的指数,即1、2、4、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接纳算法有以下四种:
分代网络算法:是当前贸易虚拟机都采纳的一种算法,依据对象存活周期的差别,将Java堆划分为新生代和老年代,并依据各个年代的特性采纳最恰当的网络算法。
新生代:多量对象死去,只要少许存活。运用『复制算法』,只需复制少许存活对象即可。
复制算法:把可用内存按容量划分为大小相称的两块,每次只运用个中的一块。当这一块的内存用尽后,把还存在世的对象『复制』到别的一块上面,再将这一块内存空间一次清算掉。完成简朴,运转高效。在对象存活率较高时就要举行较多的复制操纵,效力将会变低
老年代:对象存活率高。运用『标记—清算算法』或许『标记—整顿算法』,只需标记较少的接纳对象即可。
标记-消灭算法:起首『标记』出一切须要接纳的对象,然后一致『消灭』一切被标记的对象。标记和消灭两个历程的效力都不高,消灭之后会发生大批不一连的内存碎片,空间碎片太多可能会致使今后在程序运转历程当中须要分派较大对象时,没法找到充足的一连内存而不能不提早触发另一次垃圾网络行动。
标记-整顿算法:起首『标记』出一切须要接纳的对象,然后举行『整顿』,使得存活的对象都向一端挪动,末了直接清算掉端边境之外的内存。标记整顿算法会将一切的存活对象挪动到一端,并对不存活对象举行处置惩罚,因而其不会发生内存碎片
6、内存走漏和内存溢出的区分 ?AS有什么东西能够检测内存走漏
参考回覆:
内存溢出(out of memory):是指程序在请求内存时,没有充足的内存空间供其运用,涌现out of memory;比方请求了一个integer,但给它存了long才存下的数,那就是内存溢出。
内存走漏(memory leak):是指程序在请求内存后,没法开释已请求的内存空间,一次内存走漏伤害能够疏忽,但内存走漏聚集结果很严峻,不管若干内存,早晚会被占光。memory leak会最终会致使out of memory!
查找内存走漏能够运用Android Studio 自带的AndroidProfiler东西或MAT
7、机能优化,怎样保证运用启动不卡顿? 黑白屏怎样处置惩罚?
参考回覆:
运用启动速率,取决于你在application内里时刻做了什么事情,比方你集成了很多sdk,而且sdk的init操纵都须要在主线程里完成所以会有卡顿的觉得。在非必要的情况下能够把加载延后或则开启子线程处置惩罚
别的,影响界面卡顿的两大要素,分别是界面绘制和数据处置惩罚。
规划优化(运用include,merge标签,庞杂规划引荐运用ConstraintLayout等)
onCreate() 中不实行耗时操纵 把页面显现的 View 细分一下,放在 AsyncTask 里逐渐显现,用 Handler 更好。如许用户的看到的就是有条理有步骤的一个个的 View 的展示,不会是先看到一个黑屏,然后一下显现一切 View。最好做成动画,结果更天然。
应用多线程的目标就是只管的削减 onCreate() 和 onReume() 的时候,使得用户能尽快看到页面,操纵页面。
削减主线程壅塞时候。
进步 Adapter 和 AdapterView 的效力。
黑白屏发生缘由:当我们在启动一个运用时,体系会去搜检是不是已存在如许一个历程,假如不存在,体系的效劳会先搜检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。
以上就是11道Android机能优化面试题【附答案】的细致内容,更多请关注ki4网别的相干文章!
收藏 | 0