2019.5.31今日面试题 - Bitmap&性能优化
Bitmap
加载图片的时候需要注意什么?
技术点:Bitmap高效加载
参考回答:
- 直接加载大容量的高清Bitmap很容易出现显示不完整、内存溢出OOM的问题,所以最好按一定的采样率将图片缩小后再加载进来
- 为减少流量消耗,可对图片采用内存缓存策略,又为了避免图片占用过多内存导致内存溢出,最好以软引用方式持有图片
- 如果还需要网上下载图片,注意要开子线程去做下载的耗时操作
LRU算法的原理?
技术点:LRU算法
参考回答:为减少流量消耗,可采用缓存策略。常用的缓存算法是LRU(Least Recently Used):
- 核心思想:当缓存满时, 会优先淘汰那些近期最少使用的缓存对象。主要是两种方式:
- LruCache(内存缓存):LruCache类是一个线程安全的泛型类:内部采用一个
LinkedHashMap
以强引用的方式存储外界的缓存对象,并提供get
和put
方法来完成缓存的获取和添加操作,当缓存满时会移除较早使用的缓存对象,再添加新的缓存对象。- DiskLruCache(磁盘缓存): 通过将缓存对象写入文件系统从而实现缓存效果
引申:感兴趣可了解具体实现算法
性能优化
项目中如何做性能优化的?
技术点:性能优化实例
思路:举例说明项目注意了哪些方面的性能优化,如布局优化、绘制优化、内存泄漏优化、 响应速度优化、列表优化、Bitmap优化、 线程优化......
了解哪些性能优化的工具?
技术点:性能优化工具
思路:做项目时是否使用过的系统自带的性能优化工具?公司是否有自己的性能优化工具?实现原理怎样的?
布局上如何优化?
技术点:布局优化
参考回答:布局优化的核心就是尽量减少布局文件的层级,常见的方式有:
- 多嵌套情况下可使用RelativeLayout减少嵌套。
- 布局层级相同的情况下使用LinearLayout,它比RelativeLayout更高效。
- 使用
<include>
标签重用布局、<merge>
标签减少层级、<ViewStub>
标签懒加载。
内存泄漏是什么?为什么会发生?常见哪些内存泄漏的例子?都是怎么解决的?
技术点:内存泄漏
参考回答:内存泄漏(Memory Leak)是指程序在申请内存后,无法释放已申请的内存空间。简单地说,发生内存泄漏是由于长周期对象持有对短周期对象的引用,使得短周期对象不能被及时回收。常见的几个例子和解决办法:
- 单例模式导致的内存泄漏:单例传入参数this来自Activity,使得持有对Activity的引用。
- 解决办法:传参context.getApplicationContext()
- Handler导致的内存泄漏:Message持有对Handler的引用,而非静态内部类的Handler又隐式持有对外部类Activity的引用,使得引用关系会保持至消息得到处理,从而阻止了Activity的回收。
- 解决办法:使用静态内部类+WeakReference弱引用;当外部类结束生命周期时清空消息队列。
- 线程导致的内存泄漏:AsyncTask/Runnable以匿名内部类的方式存在,会隐式持有对所在Activity的引用。
- 解决办法:将AsyncTask和Runnable设为静态内部类或独立出来;在线程内部采用弱引用保存Context引用
- 资源未关闭导致的内存泄漏:未及时注销资源导致内存泄漏,如BraodcastReceiver、File、Cursor、Stream、Bitmap等。
- 解决办法:在Activity销毁的时候要及时关闭或者注销。
- BraodcastReceiver:调用
unregisterReceiver()
注销;- Cursor,Stream、File:调用
close()
关闭;- 动画:在
Activity.onDestroy()
中调用Animator.cancel()
停止动画- 引申:谈谈项目中是如何注意内存泄漏的问题
内存泄漏和内存溢出的区别
技术点:内存泄漏、内存溢出
参考回答:
- 内存泄漏(Memory Leak)是指程序在申请内存后,无法释放已申请的内存空间。是造成应用程序OOM的主要原因之一。
- 内存溢出(out of memory)是指程序在申请内存时,没有足够的内存空间供其使用。
什么情况会导致内存溢出?
技术点:内存溢出
参考回答:内存泄漏是导致内存溢出的主要原因;直接加载大图片也易造成内存溢出
引申:谈谈如何避免内存溢出(如何避免内存泄漏、避免直接加载大图片)
by .k
关注"编程v",每一天涨一点
STAY HUNGRY & STAY FOOLISH