zoukankan      html  css  js  c++  java
  • 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 进行设置,时间单位是秒。

    打开泄漏清理

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

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

    2. 启动定时任务进行清理 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秒运行一次维护任务
    
  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/exmyth/p/14641237.html
Copyright © 2011-2022 走看看