Android避免对象的内存泄露

内存对象的泄露会导致不再使用的对象无法及时释放,不仅浪费了宝贵的内存空间,后续要分配内存的时候,空间不足造成OOM。这样,每级的generation会变小,gc更加容易触发,引起内存抖动,带来性能问题。

  • 注意Activity的泄露
    Activity泄露是内存泄露最为严重的问题,涉及内存多,影响面广
    两种情形:

内部类引用导致Activity的泄露

典型的是Handler导致的Activity泄露,如果Handler中有延迟的任务或者等待执行的任务队列过长,很可能因为Handler继续执行造成Activity的泄露。
引用链是Looper->MessageQueue->Message->handler->Activity,解决办法是在退出UI之前执行 remove Handler消息队列中的消息与runnable对象。或者使用Static+WeakReference的方式来判断Handler和Activity之间存在引用关系。

Activity Context被传递到其他实例中,可能导致自身被引用而发生泄露

  • 考虑使用Application Context而不是Activity Context

除必须使用Activity Context的情况(Dialog的context必须是Activity),我们可以使用Application Context来避免Activity泄露

  • 注意临时Bitmap的及时回收

大多数情况下,我们对Bitmap对象增加缓存机制,但是有时候部分bitmap需要及时回收。比如我们临时创建的摸个相对大的bitmap对象,变换得到新的bitmap对象后,尽快回收原始的bitmap,及时释放原来的空间。

  • 注意监听器的注销

android程序里面register后要及时释放unregister那些监听器,自己手动add的listener,要记得remove这个listener.

  • 注意缓存容器的对象泄露

有时候我们为了提高对象的复用性,把某些对象放到缓存容器中,如果这些对象没有及时从容器中清楚,也可能导致内存泄露,

  • 注意webview的泄露

Android不同版本对webview产生有很大差异,较为严重的问题是webview的泄露,解决办法:为webview新开一个线程,通过AIDL与主进程通信,根据业务的需要在合适的时机进行销毁,从而达到内存的释放。

  • 注意cursor对象是否关闭

我们在对数据库进行操作时,使用完cursor没有及时关闭,cursor的泄露,会对内存管理带来负面影响

你可能感兴趣的:(Android避免对象的内存泄露)