零零碎碎的东西老是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无心中发现了这个每日一道面试题,想了想若是只是简单地去思考,那么不只会收效甚微,甚至难一点的题目本身可能都懒得去想,坚持不下来。因此不如把每一次的思考、理解以及别人的看法记录下来。不只加深本身的理解,更要激励本身坚持下去。git
什么是OOM
“OOM”也就是“out of memory”,意思是内存用完了。也就是说,当你去申请内存的时候,你须要的内存过大,app剩下的空余内存已经不够你使用,若是你没有捕获这个异常,系统就没办法了,会直接崩溃并抛出OOM异常。github
系统分配给每个app运行的内存空间是有限的,因此做为一名Android开发者,咱们必定要谨慎当心的使用内存。面试
OOM的类型
首先OOM的缘由就是app进程可用内存不足,有两种状况缓存
- 内存申请的速度大于gc释放内存的速度
- 内存出现泄漏,gc没法回收泄露的内存,致使可用内存愈来愈少
第一种状况又会有两种不一样的类型app
- 一次性须要的内存过大,可用内存不足。常见的是使用图片资源时加载为bitmap存储到内存,图片分辨率越高,须要的内存就越大,就可能形成OOM。
- 频繁的建立内存占用小的对象,致使内存碎片,这种叫内存抖动。虽然总体上还有内存可分配,可是这些内存空间并不连续,没法知足需求,致使OOM。常见的有ListView中contentView的建立、频繁使用String进行字符串的拼接、onDraw方法里对象的频繁建立。这一类问题要解决基本的方法就是复用已建立的对象
第二种状况就是内存泄漏,内存泄漏与OOM的关系就是量变到质变的过程,内存泄漏一定会致使可用内存的减小,大量的内存泄漏就会致使OOM问题。关于内存泄漏的具体例子在第3期已经很详细的探讨过,这里就再也不赘述。布局
OOM的预防
这里总结几点,无非是两个方面:post
- 提升系统分配的可用内存。假如app确实须要很大的内存空间,那么能够再manifest文件中设置
largeHeap="true"
增长内存的的申请量
- 减小app的内存使用
- ImageView使用合适的尺寸,多图显示缩略图,点击查看大图
- ListView使用ViewHolder复用contentView。不过如今大都用RecycleView,强制配合ViewHolder使用
- 减小bitmap对象内存的占用,可用Lru缓存、三级缓存、合适的编码等
- onDraw等频繁调用的方法中避免建立对象
- 优化布局,少用LinerLayout多用RelativeLayout
- 字符串拼接问题尽可能使用StringBuilder而不是String的+
在内存泄漏方面学习
- 使用静态内部类
- 静态类引用使用Application的Context而不是Activity的Context
- 相似广播、监听器等记得取消注册
- 游标、文件等资源使用完毕必定要关闭
- 静态集合使用完毕记得清空
- 根据不一样场景,善用软引用、弱引用