池技术,主要用于管理对象,作到对象能够重用,避免屡次建立对象的开销,是一种比较经常使用的技术。好比DB数据源的链接池。redis
在Java中频繁的建立对象和销毁对象都会消耗性能。为了不这种问题,咱们常会用到池技术。咱们确定据说过一些术语,好比:线程池,链接池。Executor调度器会管理着一个线程池,使提交的task由线程池
中的空闲状态的线程去调度执行。咱们建立数据库链接都会使用到链接池,像c3p0,这些都是咱们常常接触到的池技术用到的地方。数据库
首先单例和对象池的目的都是为了不频繁的建立对象带来的系统的开销。单例是某个对象只但愿在jvm中存在一个实例,当任何其它对象调用单例对象时不会由于其它对象正在使用这个单例对象而遭到阻塞,另外也不会同时出现多个对象须要更改单例对象的状况。换句话说,也就是说:apache
在单例对象上通常不会存在锁,竞争的资源。安全
单例对象是一种线程安全的对象jvm
因此这样的对象,咱们只但愿建立一个就好。而对象池正好和单例的特性相反。tcp
这里主要说下经常使用到的对象池管理组件common-pool2性能
对象池技术,主要用于管理对象,作到对象能够重用,避免屡次建立对象的开销。线程
common-pool2是apache开源下的对象池管理组件,是目前Java项目中使用到最广的对象池管理组件code
在实际项目中,会有不少地方,经常使用的tcp链接池,好比db,redis链接的组件都会使用到common-pool2做为链接池管理对象
common-pool2基本构思思想就是:利用一个集合来管理建立的对象,这个集合就称之为池
。当须要使用到对象时,从池中拿取一个空闲状态的对象,用完以后在放入到池中。另外可让使用者个性化的配置池的策略,
好比池对象的大小,空闲对象大小,当池中对象都处于工做状态下对象池的增加策略,当去从对象池中拿取一个对象能够等待的时间等。
GenericObjectPool:能够设置池中最大的空闲个数,最大的对象实例化个数
GenericKeyedObjectPool:对于相同的key的对象池提供一样的池策略
SoftReferenceObjectPool:基于SoftReference实现,能够随着须要自动增长对象的个数,而对象的回收利用gc
GenericObjectPool池利用LinkedBlockingDeque做为对象管理的容器和一个名为idle object eviction
的驱逐线程定时查看空闲的对象,来保证空闲的对象不会超过用户的设置。
SoftReferenceObjectPool池借组与SoftReference引用能够在内存吃紧时被gc自动回收来管理对象池中的对象,它能够随着对对象的须要而不断增长。与GenericObjectPool池比起来少了一个驱逐线程去回收空闲的对象和无用的对象。