摘要:實際應用中由于程序實現的問題,可能造成在一些極端的情況下出現沒有被調用導致的泄漏問題。在的時候檢查是否有泄漏的時候檢查泄漏如果一個對象之后秒還沒有返還給,認為是泄漏的對象秒運行一次維護任務
更多內容,請訪問 https://my.oschina.net/u/5751...
GenericObjectPoolGenericObjectPool 是 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 設置維護任務執行的時間間隔。
GenericObjectPoolpool = 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秒運行一次維護任務
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65133.html
摘要:如果為負值,表示不運行檢測線程。默認為策略的類名,默認為這里就用到了上面提到的兩個參數對象池原理分析避免泄漏配置參數詳解,以及資源回收,從池中獲取資源,將資源返還給池邏輯解析 序 本文主要解析一下apache common pools下的GenericObjectPool的參數設置 GenericObjectPool commons-pool2-2.4.2-sources.jar!/o...
摘要:使用提供了中對象池管理方式,它們的使用方式基本一樣,這里以對象池為例介紹其使用方式,一般實現自己的對象池需要經過個步驟實現接口該接口是一種工廠模式,實現其目的是讓對象池通過該工廠模式創建管理的對象創建對象池實例創建對象池我們假設對象是一 common-pool2 使用 common-pool2提供了3中對象池管理方式,它們的使用方式基本一樣,這里以GenericObjectPool對象...
摘要:單例與對象池的區別首先單例和對象池的目的都是為了避免頻繁的創建對象帶來的系統的開銷。池借組與引用可以在內存吃緊時被自動回收來管理對象池中的對象,它可以隨著對對象的需要而不斷增加。 common-pool2 池技術 池技術,主要用于管理對象,做到對象可以重用,避免多次創建對象的開銷,是一種比較常用的技術。比如DB數據源的連接池。 在Java中頻繁的創建對象和銷毀對象都會消耗性能。為了避免...
摘要:,的使用連接池的配置信息說明一個可以有多少個實例最大最小獲得一個實例的時候是否檢查連接可用性一個實例給時,是否檢查連接可用性狀態監測用異步線程進行檢查,一次最多的里的實例個數 1,JedisPool的使用 //WHEN_EXHAUSTED_FAIL = 0; ...
閱讀 1990·2021-09-22 16:05
閱讀 9255·2021-09-22 15:03
閱讀 2880·2019-08-30 15:53
閱讀 1698·2019-08-29 11:15
閱讀 903·2019-08-26 13:52
閱讀 2348·2019-08-26 11:32
閱讀 1798·2019-08-26 10:38
閱讀 2562·2019-08-23 17:19