每日一道面试题(第5期)---哪些状况下会致使OOM问题

零零碎碎的东西老是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无心中发现了这个每日一道面试题,想了想若是只是简单地去思考,那么不只会收效甚微,甚至难一点的题目本身可能都懒得去想,坚持不下来。因此不如把每一次的思考、理解以及别人的看法记录下来。不只加深本身的理解,更要激励本身坚持下去。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
  • 相似广播、监听器等记得取消注册
  • 游标、文件等资源使用完毕必定要关闭
  • 静态集合使用完毕记得清空
  • 根据不一样场景,善用软引用、弱引用
相关文章
相关标签/搜索