什么是内存泄露?
内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束。
简而言之,就是该内存空间使用完毕之后未回收。
产生内存泄露的原因有哪些?
-
1、单例造成的内存泄漏
如果一个对象已经不再需要使用了,而单例对象还持有该对象的引用,就会使得该对象不能被正常回收,从而导致了内存泄漏。 - 2、非静态内部类创建静态实例造成的内存泄漏
-
3、Handler造成的内存泄漏
解决方法:将Handler类独立出来或者使用静态内部类,这样便可以避免内存泄漏。 -
4、线程造成的内存泄漏
解决方法:将AsyncTask和Runnable类独立出来或者使用静态内部类,这样便可以避免内存泄漏。 -
5、资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,从而造成内存泄漏。
资源型对象未关闭: Cursor,File
实际开发中遇到的内存泄露场景?
1、资源型对象未关闭: Cursor,File
2、注册对象未销毁: 广播,回调监听
3、类的静态变量持有大数据对象
4、非静态内部类的静态实例
5、Handler 临时性内存泄漏: 使用静态 + 弱引用,退出即销毁
6、容器中的对象没清理造成的内存泄漏
7、WebView: 使用单独进程
如何避免内存泄露问题?
- 平常养成良好的代码书写习惯,该销毁的对象要及时销毁。
网友评论