内存泄漏

来源:互联网 发布:银行数据分析报告 编辑:程序博客网 时间:2024/06/05 03:24

http://mp.weixin.qq.com/s/nIIzHv_sqZom_y2nblCjJQ


内存泄漏

1、singleton
由于单例的静态特性,使得它的生命周期和应用的生命周期会一样长,所以一旦使用有误,小心无限制的持有Activity的引用而导致内存泄漏
很正常的一个单例模式,可就由于传入的是一个 Context,而这个 Context 的生命周期的长短就尤为重要了。如果我们传入的是 Activity 的 Context,
当这个 Context 所对应的 Activity 退出的时候,由于该 Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity 退出时它的内存并不会回收,这造成的内存泄漏就可想而知了。


2、匿名内部类/非静态内部类
Android开发经常会继承实现 Activity 或者 Fragment 或者 View。如果你使用了匿名类,而又被异步线程所引用,那得小心,如果没有任何措施同样会导致内存泄漏的:
匿名内部类会持有一个外部类的引用


3、集合对象善清除,以免内存泄漏触不及防


我们通常会把一些对象的引用加入到集合容器(比如 ArrayList)中,当我们不再需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是 static 的话,那情况就更严重了。


所以在退出程序之前,将集合里面的东西 clear,然后置为 null,再退出程序,如下:


总结
构造 Adapter 时,没有使用缓存的 convertView


Bitmap 对象不在使用时调用 recycle() 释放内存


Context 使用不当造成内存泄露:不要对一个 Activity Context 保持长生命周期的引用。尽量在一切可以使用应用 ApplicationContext 代替 Context 的地方进行替换。


非静态内部类的静态实例容易造成内存泄漏:即一个类中如果你不能够控制它其中内部类的生命周期(譬如Activity中的一些特殊Handler等),则尽量使用静态类和弱引用来处理(譬如ViewRoot的实现)。


警惕线程未终止造成的内存泄露;譬如在 Activity 中关联了一个生命周期超过 Activity 的 Thread,在退出 Activity 时切记结束线程。一个典型的例子就是 HandlerThread 的 run 方法是一个死循环,它不会自己结束,线程的生命周期超过了 Activity 生命周期,我们必须手动在Activity的销毁方法中中调运 thread.getLooper().quit(); 才不会泄露。


对象的注册与反注册没有成对出现造成的内存泄露;譬如注册广播接收器、注册观察者(典型的譬如数据库的监听)等。


创建与关闭没有成对出现造成的泄露;譬如 Cursor 资源必须手动关闭,WebView 必须手动销毁,流等对象必须手动关闭等。


不要在执行频率很高的方法或者循环中创建对象(比如onmeasure),可以使用 HashTable 等创建一组对象容器从容器中取那些对象,而不用每次new与释放。


避免代码设计模式的错误造成内存泄露;譬如循环引用,A持有B,B持有C,C持有A,这样的设计谁都得不到释放。

0 0
原创粉丝点击