资讯专栏INFORMATION COLUMN

GenericObjectPool 避免泄漏

Keven / 2876人阅读

摘要:实际应用中由于程序实现的问题,可能造成在一些极端的情况下出现没有被调用导致的泄漏问题。在的时候检查是否有泄漏的时候检查泄漏如果一个对象之后秒还没有返还给,认为是泄漏的对象秒运行一次维护任务

更多内容,请访问 https://my.oschina.net/u/5751...

GenericObjectPool

GenericObjectPool 是 Apache Commons Pool 提供的对象池,使用的时候需要调用 borrowObject 获取一个对象,使用完以后需要调用 returnObject 归还对象,或者调用 invalidateObject 将这个对象标记为不可再用。

实际应用中由于程序实现的问题,可能造成在一些极端的情况下出现 borrowObject/invalidateObject 没有被调用导致的泄漏问题。对象泄漏会导致对象池中的对象数量一直上升,达到设置的上限以后再调用 borrowObject 就会永远等待或者抛出 java.util.NoSuchElementException: Timeout waiting for idle object 异常。

对于这种问题,一方面是从应用实现上进行排查,另一方面可以通过 GenericObjectPool 自带的机制进行清理。

设置自动清理 设置抛弃时间

GenericObjectPool判断一个对象是否泄漏是根据对象最后一次使用或者最后一次borrow的时间进行判断的,如果超出了预设的值就会被认为是一个泄漏的对象被清理掉(PooledObjectFactory.destroyObject在这一过程中会被调用)。抛弃时间可以通过 AbandonedConfig.setRemoveAbandonedTimeout 进行设置,时间单位是秒。

打开泄漏清理

设置了抛弃时间以后还需要打开泄漏清理才会生效。泄漏判断的开启可以通过两种方式:

从对象池中获取对象的时候进行清理
如果当前对象池中少于2个idle状态的对象或者 active数量>最大对象数-3 的时候,在borrow对象的时候启动泄漏清理。通过 AbandonedConfig.setRemoveAbandonedOnBorrow 为 true 进行开启。

启动定时任务进行清理
AbandonedConfig.setRemoveAbandonedOnMaintenance 设置为 true 以后,在维护任务运行的时候会进行泄漏对象的清理,可以通过 GenericObjectPool.setTimeBetweenEvictionRunsMillis 设置维护任务执行的时间间隔。

GenericObjectPool pool = new GenericObjectPool(new MyPooledObjectFactory(),config);

AbandonedConfig abandonedConfig = new AbandonedConfig();

abandonedConfig.setRemoveAbandonedOnMaintenance(true); //在Maintenance的时候检查是否有泄漏

abandonedConfig.setRemoveAbandonedOnBorrow(true); //borrow 的时候检查泄漏

abandonedConfig.setRemoveAbandonedTimeout(10); //如果一个对象borrow之后10秒还没有返还给pool,认为是泄漏的对象

pool.setAbandonedConfig(abandonedConfig);

pool.setTimeBetweenEvictionRunsMillis(5000); //5秒运行一次维护任务

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65133.html

相关文章

  • GenericObjectPool参数解析

    摘要:如果为负值,表示不运行检测线程。默认为策略的类名,默认为这里就用到了上面提到的两个参数对象池原理分析避免泄漏配置参数详解,以及资源回收,从池中获取资源,将资源返还给池逻辑解析 序 本文主要解析一下apache common pools下的GenericObjectPool的参数设置 GenericObjectPool commons-pool2-2.4.2-sources.jar!/o...

    huayeluoliuhen 评论0 收藏0
  • common-pool2 使用

    摘要:使用提供了中对象池管理方式,它们的使用方式基本一样,这里以对象池为例介绍其使用方式,一般实现自己的对象池需要经过个步骤实现接口该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象创建对象池实例创建对象池我们假设对象是一 common-pool2 使用 common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象...

    since1986 评论0 收藏0
  • common pool2

    摘要:单例与对象池的区别首先单例和对象池的目的都是为了避免频繁的创建对象带来的系统的开销。池借组与引用可以在内存吃紧时被自动回收来管理对象池中的对象,它可以随着对对象的需要而不断增加。 common-pool2 池技术 池技术,主要用于管理对象,做到对象可以重用,避免多次创建对象的开销,是一种比较常用的技术。比如DB数据源的连接池。 在Java中频繁的创建对象和销毁对象都会消耗性能。为了避免...

    jsyzchen 评论0 收藏0
  • JedisPool使用原理及源代码

    摘要:,的使用连接池的配置信息说明一个可以有多少个实例最大最小获得一个实例的时候是否检查连接可用性一个实例给时,是否检查连接可用性状态监测用异步线程进行检查,一次最多的里的实例个数 1,JedisPool的使用 //WHEN_EXHAUSTED_FAIL = 0; ...

    newtrek 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<