关于Android中的内存泄漏的问题

243 阅读2分钟

       最近突然考虑到自己产品中有什么需要优化的地方,于是就用Square的Leakcannary检测了一下发现发生内存泄漏的地方还真是有几处,平时都没怎么注意到的地方。接下来就说一下出现内存泄漏的原因以及解决方案。

       内存泄漏:有些对象只有有限的生命周期,当他们完成自己的任务后将被垃圾回收。如果在这个对象的生命周期结束后,这个对象仍然被一系列的引用那么这样就会导致内存泄漏。随着泄漏的累积,那么最终App的内存将会耗尽。

       内存泄漏产生的影响:他是造成应用程序OOM的重要原因之一。Android中系统为每个应用程序分配的内存有限。当一个应用中内存泄漏的比较多的时候就会导致当前应用所占用的内存超出系统所默认分配的内存。这就导致类内存溢出进而导致OOM。

        关于leakCannary的使用说明见下面链接。

        LeakCanary 中文使用说明

1.错误使用单例模式导致的内存泄漏

在开发中少不了使用单例模式。单例中所持有的context对象生命周期比单例对象生命周期短时或导致Context无法释放时,则有可能导致内存泄漏。解决办法要保证Context和Application生命周期一致。

2.Handler导致的内存泄漏

开发中难免会使用Handler来传递消息。一般会以内部类的方式来创建Handler,而内部类又默认会持有外部类的引用。当Activity被销毁时,此时handler还有未发送完的消息,调用post方法后Handler装入一个Message,并把这条Message推到MessageQueue中,MessageQueue是在一个Looper线程中不断轮询处理消息,那么当这个Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,所以导致该Activity的内存资源无法及时回收,引发内存泄漏。
解决Handler导致的内存泄漏很简单了。
1.Handler声明成静态的并且弱引用Activity
2.在Activity onDestory()的时候调用handler的removeAllCallBacks方法。

3.非静态内部类导致的内存泄漏

当外部类对象需要被释放的时候若此时内部类对象任需被使用的时候此时也会引发内存泄漏。
解决方法就是:将内部类生命成静态的。或者少使用内部类。

后期补充。。。