内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后, 因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
1.集合类泄漏
集合如果只有添加元素的方法,没有相应的删除机制,就会到之后内存被占用。
如果这个集合是全局的变量,没有相应的删除机制,就会导致集合占用的内存只增加不减。
解决方法:在退出程序之前,将集合里的东西clear,然后置为null,再退出程序。
2.单例造成的内存泄漏
单列的静态特性的生命周期和应用的生命周期一样长,如果使用不恰当,就会造成内存泄露。
解决方法:单例的生命周期和应用的一样长,这样就防止了内存泄漏
3.非静态内部类创建静态实例造成的内存泄漏
解决方法:将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,就使用Application的Context。
4.线程造成的内存泄漏
AsyncTask和Runnable都使用了匿名内部类,那么它们将持有其所在Activity的隐式引用。
如果任务在Activity销毁之前还未完成,那么将导致Activity的内存资源无法被回收,从而造成内存泄漏。
解决方法:将AsyncTask和Runnable类独立出来或者使用静态内部类,这样便可以避免内存泄漏。
5.Handler 造成的内存泄漏
handler、message和messageQueue都是相互关联在一起的,万一handler发送的message没有被处理,
message和发送的handler对象被线程messagequeue一直持有。handler属于tls变量,生命周期和view,activity是不一致的,导致无法正常释放。
解决方法:将Handler类独立出来或者使用静态内部类,这样便可以避免内存泄漏。
6.尽量避免使用 static 成员变量
如果你的app进程设计上是长驻内存的,那即使app切到后台,这部分内存也不会被释放。按照现在手机app内存管理机制,
占内存较大的后台进程将优先回收,yi'wei如果此app做过进程互保保活,那会造成app在后台频繁重启。
当手机安装了你参与开发的app以后一夜时间手机被消耗空了电量、流量,你的app不得不被用户卸载或者静默。
7.WebView造成的泄露
当我们不要使用WebView对象时,应该调用它的destory()函数来销毁它,并释放其占用的内存,否则其长期占用的内存也不能被回收,从而造成内存泄露。
解决方法:为WebView另外开启一个进程,通过AIDL与主线程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放。
8.资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,游标 Cursor,Stream,Bitmap等资源的使用,
应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
解决方法:在我们的程序退出时一定要确保我们的资源性对象已经关闭。
9.一些不良代码造成的内存压力