Nixo Home

内存优化2 - OOM面试题

字数统计: 723阅读时长: 2 min
2019/07/18 Share

OOM

  • 1.什么事是OOM
  • 2.一些容易混淆的概念
  • 3.如何解决OOM

什么是OOM

在线上项目中异常后台日志中会看到一些OOM的异常,OOM其实就是当我们使用的内存加上申请的内存大于Dailvk虚拟机最大的内存限制,就会出现Out of memory异常,也就是内存溢出,内存不够导致的,大部分OOM问题都跟Bitmap加载相关。

容易混淆的概念

内存溢出/内存泄漏/内存抖动

  • 内存溢出(OOM)
  • 内存抖动(内存抖动是短时间内大量的对象被创建出来,然后瞬间的释放,瞬间产生的对象会严重的占用内存区域,然后频繁的触发GC)
  • 内存泄漏(进程中的对象已经不被其他对象引用到了,但是他们可以直接或者间接地引用到其他还没有被回收的对象,导致GC不能回收,一旦内存泄漏累积过多,也会产生OOM的现象)

如何解决OOM

  • 有关Bitmap
  • 其他

Bitmap

  • 图片显示{
    比如说缩略图,像ListView 我们滑动过程中不要网络请求显示图片,可以在滑动结束后,请求图片在展示
    }
  • 及时使用recycle释放内存
  • 图片压缩{
    有时候要在一开始要加载很大很大的大图,大图直接超过了内存可分配的大小,这样肯定会导致内存溢出OOM,所以这时候就要对加载的Bitmap大小进行控制可以使用inSimpleSize设置缩放比例属性,在图片进入内存之前我们要设计个合适的缩放比例避免不必要的大图载入
    }
  • 使用inBitmap属性{
    它可以通知bitmap的解码器复用使用过的内存区域,而不是重新开辟内存区域存放bitmap,也就是他有很多很多图片,也只会用到屏幕可以展示出的bitmap数量的内存大小,这是Android对Bitmap的优化
    }
  • 捕获异常{
    在Android中读Bitmap时分给虚拟机的内存大小是有限制的,所以防止在Bitmap实例化的时候出现OOM异常,我们需要在实例化的地方进行异常捕获注意OOM是Error而不是Excation
    }

其他

  • listView{
    避免在onDraw中进行对象的创建,这样会在一瞬间创建大量对象,增加堆内存负担,导致频繁GC,产生内存抖动现象,内存抖动现象积累到一定程度,也会导致OOM
    }
  • 谨慎多进程{
    虽然说多进程可以增加应用内存可分配的范围,比如说WebView,定位等单独开辟进程,但是多进程使用不当会导致内存增长和其他cartch,还会产生拒绝服务漏洞等问题。
    }
CATALOG
  1. 1. OOM
    1. 1.1. 什么是OOM
    2. 1.2. 容易混淆的概念
    3. 1.3. 如何解决OOM
      1. 1.3.1. Bitmap
      2. 1.3.2. 其他