Android——内存泄露与溢出

内存溢出( 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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。