[回收机制] BaseGenericObjectPool<T>.evict() - 执行numTests个空闲池对象的驱逐测试，
驱逐那些符合驱逐条件的被审查对象

如果testWhileIdle为true，则被审查的对象在访问期间是有效的(无效则会被删除)；否则，仅有那些池对象的空闲时间超过minEvicableIdleTimeMillis会被删除。

当这是一个有问题的驱逐空闲池对象时，才会抛出Exception异常。
[池对象] PooledObjectState - 提供可能的"池对象的状态"表示

IDLE：In the queue, not in use. (在空闲队列中)

ALLOCATED：In use. (使用中)

EVICTION：In the queue, currently being tested for possible eviction.
(在空闲队列中，目前正在被驱逐检测中)

VALIDATION：In the queue, currently being validated. (在空闲队列中，目前正在有效性校验中)

INVALID：Failed maintenance (e.g. eviction test or validation) and will
be / has been destroyed (失败的维护，并将会被销毁)

ABANDONED：Deemed abandoned, to be invalidated. (视为废弃，是无效的)

RETURNING：Returning to the pool. (正在返回给对象池)
[回收机制] BaseGenericObjectPool<T>.evict() - 执行numTests个空闲池对象的驱逐测试，
驱逐那些符合驱逐条件的被审查对象

public final boolean getTestWhileIdle()：返回对象池中的空闲对象是否会被"空闲对象驱逐者"验证其有效性
(见setTimeBetweenEvictionRunsMillis(long))。

校验是通过与该对象池相关的池对象工厂的 validateObject(PooledObject) 方法进行的。

如果对象校验失败，则它会从对象池中被删除并销毁。

默认是false，池对象不会被"空闲对象驱逐者"验证其有效性。


public final void setTimeBetweenEvictionRunsMillis(long
timeBetweenEvictionRunsMillis)：设置"空闲对象驱逐者线程"间隔运行之间的休眠毫秒数。（同时，会立即启动"空闲对象驱逐者线程"）

如果该值是非正整数，没有"空闲对象驱逐者线程"将运行。

默认是-1，即没有"空闲对象驱逐者线程"后台运行着。 


private int getNumTests()：计算空闲对象驱逐者一轮测试的对象数量。

返回要测试其有效性的对象数量


public final int
getNumTestsPerEvictionRun()：返回空闲对象驱逐者线程在每轮运行期间要检测的对象的最大数量。

如果该值是正数，一轮执行的测试数量将会是配置的值和对象池的空闲实例数量的最低值；
如果该值是负数，一轮执行的测试数量将会是 ceil(getNumIdle/abs(getNumTestsPerEvictionRun))}，
这意味着，如果该值是-n，每次运行的测试数量大概是空闲对象的1/n。

默认是每轮测试3个空闲对象。


public final long
getSoftMinEvictableIdleTimeMillis()：返回对象池中一个空闲对象的最小可空闲时间，在被空闲对象驱逐者驱逐之前。

其它额外条件是，对象池中至少保留minIdle个对象实例。

此设置会被getMinEvictableIdleTimeMillis()的返回值覆盖(也就是说，如果getMinEvictableIdleTimeMillis()的返回值是正整数，则getSoftMinEvictableIdleTimeMillis()被忽略)。（从GenericObjectPool.evict()实现看，这里描述的不对！）

默认是-1，即对象只要一有空闲，就被纳入到驱逐对象列表中。


public final long
getMinEvictableIdleTimeMillis()：返回对象池中一个空闲对象的最大可空闲时间，在被空闲对象驱逐者驱逐之前。

如果该值是非正数，则在空闲期间没有对象会从对象池中被驱逐出去。

默认是30分钟，即只要空闲对象的空闲时间超过30分钟，都会立刻从对象池中被驱逐出去。


public int getMinIdle()：返回对象池中维护的空闲对象的最小数量目标。

此设置仅会在getTimeBetweenEvictionRunsMillis()的返回值大于0时， 且该值是正整数时才会生效。

默认是0，即对象池不维护空闲的池对象。


public final boolean
getLifo()：返回"对象池"是否使用空闲对象的LIFO(后进先出)行为，总是从对象池中返回最近使用的对象；或者，使用FIFO(先进先出)队列，对象池总是返回空闲对象池中最老的那个对象。

默认是true，即使用LIFO(后进先出)行为。