内存溢出( 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关键字等。
安卓中怎样避免内存泄漏
- 不要将Context对象传给activity与fragment以外的对象。
- 永远不要将Context和View存储在静态变量中。
- 在onPause()/onDestroy()方法中解除监听器,包括在Android自己的Listener,Location Service或Display Manager Service以及自己写的Listener。
- 不要在后台线程与AsyncTask中存储activity的强引用。不然当Activity被关闭后,由于AsyncTask仍在执行且持有Activity的强引用,导致Activity无法被回收。
- 使用Application Context而不是Activity的Context
- 尽量不要用非静态内部类,因为它会持有外部类的引用。在非静态内部类中存储Activity或View的引用会导致内存泄露。如需存储就使用WeakReference。