使用GenericObjectPool避免泄漏設(shè)置方法
GenericObjectPool
GenericObjectPool 是 Apache Commons Pool 提供的對象池,使用的時候需要調(diào)用 borrowObject 獲取一個對象,使用完以后需要調(diào)用 returnObject 歸還對象,或者調(diào)用 invalidateObject 將這個對象標記為不可再用。
實際應(yīng)用中由于程序?qū)崿F(xiàn)的問題,可能造成在一些極端的情況下出現(xiàn) borrowObject/invalidateObject 沒有被調(diào)用導(dǎo)致的泄漏問題。
對象泄漏會導(dǎo)致對象池中的對象數(shù)量一直上升,達到設(shè)置的上限以后再調(diào)用 borrowObject 就會永遠等待或者拋出 java.util.NoSuchElementException: Timeout waiting for idle object
異常。
對于這種問題,一方面是從應(yīng)用實現(xiàn)上進行排查,另一方面可以通過 GenericObjectPool 自帶的機制進行清理。
設(shè)置自動清理
設(shè)置拋棄時間
GenericObjectPool判斷一個對象是否泄漏是根據(jù)對象最后一次使用或者最后一次borrow的時間進行判斷的,如果超出了預(yù)設(shè)的值就會被認為是一個泄漏的對象被清理掉(PooledObjectFactory.destroyObject在這一過程中會被調(diào)用)。
拋棄時間可以通過 AbandonedConfig.setRemoveAbandonedTimeout 進行設(shè)置,時間單位是秒。
打開泄漏清理
設(shè)置了拋棄時間以后還需要打開泄漏清理才會生效。泄漏判斷的開啟可以通過兩種方式:
- 從對象池中獲取對象的時候進行清理
如果當前對象池中少于2個idle狀態(tài)的對象或者 active數(shù)量>最大對象數(shù)-3 的時候,在borrow對象的時候啟動泄漏清理。通過 AbandonedConfig.setRemoveAbandonedOnBorrow 為 true 進行開啟。
- 啟動定時任務(wù)進行清理
AbandonedConfig.setRemoveAbandonedOnMaintenance 設(shè)置為 true 以后,在維護任務(wù)運行的時候會進行泄漏對象的清理,可以通過 GenericObjectPool.setTimeBetweenEvictionRunsMillis 設(shè)置維護任務(wù)執(zhí)行的時間間隔。
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秒運行一次維護任務(wù)
以上就是使用GenericObjectPool避免泄漏設(shè)置方法的詳細內(nèi)容,更多關(guān)于GenericObjectPool避免泄漏的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java字符編碼原理(動力節(jié)點Java學(xué)院整理)
Java開發(fā)中,常常會遇到亂碼的問題,一旦遇到這種問題,常常比較煩惱,大家都不想承認是自己的代碼問題,其實搞明白編碼的本質(zhì)過程就簡單多了,接下來小編給大家?guī)韏ava字符編碼原理,要求看看吧2017-04-04Java函數(shù)式編程之通過行為參數(shù)化傳遞代碼
行為參數(shù)化就是可以幫助你處理頻繁變更的需求的一種軟件開發(fā)模式,這篇文章將給大家詳細的介紹一下Java函數(shù)式編程之行為參數(shù)化傳遞代碼,感興趣的同學(xué)可以參考閱讀下2023-08-08SpringMVC @RequestMapping注解作用詳解
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01