使用GenericObjectPool避免泄漏设置方法

 更新时间:2023年09月24日 08:45:42   作者:channingbj  
这篇文章主要为大家介绍了使用GenericObjectPool避免泄漏的设置方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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<PoolObj> pool = new GenericObjectPool<PoolObj>(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秒运行一次维护任务

以上就是使用GenericObjectPool避免泄漏设置方法的详细内容,更多关于GenericObjectPool避免泄漏的资料请关注脚本之家其它相关文章!

相关文章

  • 详解使用Java原生代理实现AOP实例

    详解使用Java原生代理实现AOP实例

    本篇文章主要介绍了详解使用Java原生代理实现AOP实例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • Java 详解Map集合之HashMap和TreeMap

    Java 详解Map集合之HashMap和TreeMap

    本章具体介绍了HashMap、TreeMap两种集合的基本使用方法和区别,图解穿插代码实现。 JAVA成仙路从基础开始讲,后续会讲到JAVA高级,中间会穿插面试题和项目实战,希望能给大家带来帮助
    2022-03-03
  • Springboot整合Socket实现单点发送,广播群发,1对1,1对多实战

    Springboot整合Socket实现单点发送,广播群发,1对1,1对多实战

    本文主要介绍了Springboot整合Socket实现单点发送,广播群发,1对1,1对多实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 使用Java代码将IP地址转换为int类型的方法

    使用Java代码将IP地址转换为int类型的方法

    这篇文章主要介绍了使用Java代码将IP地址转换为int类型的方法,这也是各大计算机考试和ACM以及面试的常见基础问题,需要的朋友可以参考下
    2015-08-08
  • Springboot获取文件内容如何将MultipartFile转File

    Springboot获取文件内容如何将MultipartFile转File

    本文给大家介绍Springboot获取文件内容,将MultipartFile转File方法,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • Spring监听器及定时任务实现方法详解

    Spring监听器及定时任务实现方法详解

    这篇文章主要介绍了Spring监听器及定时任务实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • springmvc path请求映射到bean 方法的流程

    springmvc path请求映射到bean 方法的流程

    这篇文章主要介绍了springmvc path请求映射到bean 方法的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 详解Java两种方式简单实现:爬取网页并且保存

    详解Java两种方式简单实现:爬取网页并且保存

    本篇文章主要介绍了Java两种方式简单实现:爬取网页并且保存 ,主要用UrlConnection、HttpClient爬取实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • Java利用LocalDate类实现日历设计

    Java利用LocalDate类实现日历设计

    java中做时间处理时一般会采用java.util.Date,但是相比于Date来说,还有更好的选择--java.time.LocalDate。本文就来用LocalDate类实现日历设计,感兴趣的可以动手尝试一下
    2022-07-07
  • 一文带你剖析Redisson分布式锁的原理

    一文带你剖析Redisson分布式锁的原理

    相信使用过redis的,或者正在做分布式开发的童鞋都知道redisson组件,它的功能很多,但我们使用最频繁的应该还是它的分布式锁功能,少量的代码,却实现了加锁、锁续命(看门狗)、锁订阅、解锁、锁等待(自旋)等功能,我们来看看都是如何实现的
    2022-11-11

最新评论