Android——内存泄露与溢出

Android——内存泄露与溢出_第1张图片

内存溢出( out of memory )

  程序在申请内存时,求分配的内存超出系统所能提供的内存,系统不能满足于是溢出。例:用1000ml水,到入100ml的容器,最终100ml的容器无法装下1000ml水溢出去。

内存泄漏(memory leak)

  指程序在申请内存后,无法释放已申请的内存空间。内存泄漏可分为4种:常发性内存泄漏、偶发性内存泄漏、一次性内存泄漏、隐式内存泄漏。

内存泄漏与内存溢出的联系

  内存泄漏的不断堆积,最终会超系统的内存,造成内存溢出。

安卓OOM

  java.lang.OutOfMemoryException内存溢出异常,简称OOM。造成OOM原因主要是内存泄漏堆积系统内存不足内存溢出。

安卓中容易导致OOM情况有以下几种:

  • 数据库的cursor没有关闭。
  • 构造adapter没有使用缓存contentview。
  • 调用registerReceiver()后未调用unregisterReceiver().
  • 未关闭InputStream/OutputStream。
  • Bitmap使用后未调用recycle()。
  • Context泄漏。
  • static关键字等。

安卓中怎样避免内存泄漏

  1. 不要将Context对象传给activity与fragment以外的对象。
  2. 永远不要将Context和View存储在静态变量中。
  3. 在onPause()/onDestroy()方法中解除监听器,包括在Android自己的Listener,Location Service或Display Manager Service以及自己写的Listener。
  4. 不要在后台线程与AsyncTask中存储activity的强引用。不然当Activity被关闭后,由于AsyncTask仍在执行且持有Activity的强引用,导致Activity无法被回收。
  5. 使用Application Context而不是Activity的Context
  6. 尽量不要用非静态内部类,因为它会持有外部类的引用。在非静态内部类中存储Activity或View的引用会导致内存泄露。如需存储就使用WeakReference。

你可能感兴趣的:(Android——内存泄露与溢出)