Apache Common Pool2 对象池应用浅析

作者 | 乔宇    


640?wx_fmt=jpeg

杏仁后端工程师,关注服务端技术。

我们系统中一般都会存在很多可重用并长期使用的对象,比如线程、TCP 连接、数据库连接等。虽然我们可以简单的在使用这些对象时进行创建、使用结束后销毁,但初始化和销毁对象的操作会造成一些资源消耗。我们可以使用对象池将这些对象集中管理,减少对象初始化和销毁的次数以节约资源消耗。

顾名思义,对象池简单来说就是存放对象的池子,可以存放任何对象,并对这些对象进行管理。它的优点就是可以复用池中的对象,避免了分配内存和创建堆中对象的开销;避免了释放内存和销毁堆中对象的开销,进而减少垃圾收集器的负担;避免内存抖动,不必重复初始化对象状态。对于构造和销毁比较耗时的对象来说非常合适。

当然,我们可以自己去实现一个对象池,不过要实现的比较完善还是要花上不少精力的。所幸的是, Apache 提供了一个通用的对象池技术的实现: Common Pool2,可以很方便的实现自己需要的对象池。Jedis 的内部对象池就是基于 Common Pool2 实现的。

核心接口

Common Pool2 的核心部分比较简单,围绕着三个基础接口和相关的实现类来实现:

  • ObjectPool:对象池,持有对象并提供取/还等方法。

  • PooledObjectFactory:对象工厂,提供对象的创建、初始化、销毁等操作,由 Pool 调用。一般需要使用者自己实现这些操作。

  • PooledObject:池化对象,对池中对象的封装,封装对象的状态和一些其他信息。

640?wx_fmt=jpeg

Common Pool2 提供的最基本的实现就是由 Factory 创建对象并使用PooledObject 封装对象放入 Pool 中。

对象池实现

640?wx_fmt=jpeg

对象池有两个基础的接口 ObjectPool  KeyedObjectPool, 持有的对象都是由 PooledObject 封装的池化对象。 KeyedObjectPool 的区别在于其是用键值对的方式维护对象。

ObjectPool 和 KeyedObjectPool 分别有一个默认的实现类GenericObjectPool  GenericKeyedObjectPool 可以直接使用,他们的公共部分和配置被抽取到了 BaseGenericObjectPool 中。

SoftReferenceObjectPool 是一个比较特殊的实现,在这个对象池实现中,每个对象都会被包装到一个SoftReference中。SoftReference允许垃圾回收机制在需要释放内存时回收对象池中的对象,可以避免一些内存泄露的问题。

ObjectPool

下面简单介绍一下 ObjectPool 接口的核心方法,KeyedObjectPool ObjectPool 类似,区别在于方法多了个参数: K key

public interface ObjectPool<T> {
   


// 从池中获取一个对象,客户端在使用完对象后必须使用 returnObject 方法返还获取的对象 T borrowObject () throws Exception , NoSuchElementException , IllegalStateException ; // 将对象返还到池中。对象必须是从 borrowObject 方法获取到的 void returnObject ( T obj ) throws Exception ; // 使池中的对象失效,当获取到的对象被确定无效时(由于异常或其他问题),应该调用该方法 void invalidateObject ( T obj ) throws Exception ; // 池中当前闲置的对象数量 int getNumIdle (); // 当前从池中借出的对象的数量 int getNumActive (); // 清除池中闲置的对象 void clear () throws Exception , UnsupportedOperationException ; // 关闭这个池,并释放与之相关的资源 void close ();
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值