GenericObjectPool 避免泄漏
来源:互联网 发布:linux hexdump命令 编辑:程序博客网 时间:2024/05/29 06:30
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
- Android 避免内存泄漏
- 避免内存泄漏
- Android 避免内存泄漏
- 如何避免内存泄漏
- 如何避免内存泄漏
- c++避免内存泄漏
- 如何避免内存泄漏
- c++避免内存泄漏
- Android 避免内存泄漏
- 避免android 内存泄漏
- 如何避免内存泄漏?
- 避免内存泄漏问题
- 避免Context内存泄漏
- 如何避免Android内存泄漏
- Android中避免内存泄漏
- 如何避免Android内存泄漏
- windows下安装grunt 插件模版
- 【邀请函】2017网易云创大会教育论坛诚邀您来
- JavaScript 计算一个字符串中出现次数最多的字符
- 来说说(Prototype)原型模式
- 安装mysql报错
- GenericObjectPool 避免泄漏
- 给Java新手的一些建议——Java知识点归纳(Java基础部分)
- 使用 C# 编写简易 ASP.NET Web 服务器
- Performance Schema使用简介(一)
- js基础知识
- 阿里百川SDK初始化失败,SecurityGuard init error
- Darwin 框架概述
- RFCOMM
- Windows Socket 编程_ 简单的服务器/客户端程序