淘先锋技术网

首页 1 2 3 4 5 6 7

【Android对象池 点击打开链接】

【 Handler Message对象池的应用点击打开链接】

对象池以及其在Android中的应用。

Object pool模式

如果你对object pool模式还不太了解的话,可以先

看看这里。

简单总结一下,对象池可以看做一种空间换时间的策略。可以看作是减少GC压力的首选方法,同时也是最简单的方法。在下面两种分配模式下,可以选择使用对象池:

对象以固定的速度不断地分配,垃圾收集时间逐步增加,内存使用率随之增大;

对象分配存在爆发期,而每次爆发都会导致系统迟滞,并伴有明显的GC中断。

双刃剑

以前写作文的时候,尤其是英语作文的时候,经常会说一个事物都会有它的两面性 :), 对象池也不例外,来看看它的优缺点:

Pros:

由于我们不再频繁的或者突然大量的创建新对象,所以其降低了heap使用内存的突然抖动。

减少了GC导致的performance的退化。

对于实时性要求高的应用,或者系统资源紧张的情况有很大的帮助。

Cons:

可能会引入并发相关的bug。

因为dirty ojbect的存在,也可能会引入相应的bug。

正是基于此,我们在使用对象池的时候一定要慎重,一个稳妥的方法是在使用之前先测量一下你的应用performance,看看其运行速度到底是多块,然后采用对象池后再次测量,看是否有提高。如果提高了,很好,可以使用!否则的话就不需要多此一举了。

当你决定要采用对象池的时候,一定要加强测试你的程序,尤其是关于并发的方面的unit test要多做,从而避免引入相关的bug。

Android中对象池的应用

Android平台已经帮我们实现好了对象池,常用的是SynchronizedPool。下面是个例子。假设你的应用会频繁的大量的需要创建某个类的对象,那么我们就可以将该类改造成支持对象池模式,代码如下:

public class MyPooledClass {

privatestaticfinal SynchronizedPool sPool =

newSynchronizedPool(10);

publicstatic MyPooledClassobtain() {

MyPooledClassinstance=sPool.acquire();

return(instance != null) ?instance:newMyPooledClass();

}

public voidrecycle() {

// Clear stateifneeded.

sPool.release(this);

}

. . .

}

可以看到实现起来非常简单,只需要在类内部创建一个SynchronizedPool,然后提供obtain和recycle接口即可。

当想创建MyPooledClass的对象的时候,我们不再使用:

MyPooledClass myObject = new MyPooledClass();

而是调用:

MyPooledClass myObject=MyPooledClass.obtain();

当该对象不再使用的时候,记得要将其释放回对象池,否则对象池被用完后,以后每次再去obtain的话就会导致创建一个新对象,这样的话对象池就不再有任何作用。

myObject.recycle();