内存泄漏:
用动态存储分配函数开辟的空间,在使用完之后没有释放这块内存单元,直到程序结束。说白了就是对象使用完了,没有及时回收这个对象占用的内存空间。
内存泄漏的危害
如果一直不回收内存,那么可用内存就会越来越少,程序效率就会降低,最后造成内存溢出,然后程序就会崩掉。
在android开发中,最容易引发内存泄漏的就是Context,你如Activity的Context,因为它包含大量的引用,一旦泄漏了context就意味着泄漏了它所指向的所有对象。如果内存泄漏太多就会导致OOM。
下面几种场景会导致内存泄漏
1.静态变量持有一些对象的引用: 比如一个静态变量持有Activity的引用,那么这个activity就不会被回收。
2.属性动画没有取消导致内存泄漏: 就是如果使用了无限循环的动画,那么一定要在Activity中对这个动画进行释放。不然就会导当前的Activity不能被回收。
3.Handler的使用不当: 当一个android主线程被创建的时候,同时会有一个Looper对象被创建,而这个Looper对象会实现一个MessageQueue(消息队列),当我们创建一个handler对象时,而handler的作用就是放入和取出消息从这个消息队列中,每当我们通过handler将一个msg放入消息队列时,这个msg就会持有一个handler对象的引用。因此当Activity被结束后,这个msg在被取出来之前,这msg会继续存活,但是这个msg持有handler的引用,而handler在Activity中创建,会持有Activity的引用。
4.监听器的注销:
在Android程序里面存在很多需要register与unregister的监听器,我们需要确保在合适的时候及时unregister那些监听器。自己手动add的listener,需要记得及时remove这个listener
5.注意Cursor对象是否及时关闭
在程序中我们经常会进行查询数据库的操作,但时常会存在不小心使用Cursor之后没有及时关闭的情况。这些Cursor的泄露,反复多次出现的话会对内存管理产生很大的负面影响,我们需要谨记对Cursor对象的及时关闭。
6.bitmap资源没有及时释放掉:
当你确定这个Bitmap资源不会再被使用的时候(当然这个Bitmap不释放可能会让程序下一次启动或者resume快一些,但是其占用的内存资源太大,可能导致程序在后台的时候被杀掉,反而得不偿失),我们建议手动调用recycle()方法,释放其Native内存。