java 线程池 资源回收_JAVA线程池资源回收的问题
最近項(xiàng)目中為了提高用戶(hù)體驗(yàn)度,前臺(tái)創(chuàng)建任務(wù)后臺(tái)任務(wù),用多線(xiàn)程來(lái)跑。
現(xiàn)在的場(chǎng)景:后臺(tái)定時(shí)任務(wù)管理這兩個(gè)線(xiàn)程池,一個(gè)最大線(xiàn)程數(shù)10個(gè),一個(gè)最大線(xiàn)程數(shù)15。應(yīng)用部署之后,不超過(guò)5個(gè)小時(shí),服務(wù)器負(fù)載高,內(nèi)存使用過(guò)多。
分析原因:因?yàn)檫@個(gè)功能是excel導(dǎo)入功能,如果前臺(tái)有大量的導(dǎo)入任務(wù)時(shí),那么后臺(tái)的負(fù)載就會(huì)很高。
我的實(shí)現(xiàn)原理:定時(shí)任務(wù)讀取任務(wù),放到任務(wù)隊(duì)列表中,然后使用線(xiàn)程池消費(fèi)任務(wù)隊(duì)列中的任務(wù),每個(gè)線(xiàn)程時(shí)一直循環(huán)取任務(wù)。
我的定時(shí)任務(wù)周期是 1 分鐘,線(xiàn)程池從初始化時(shí),空閑線(xiàn)程存活的時(shí)間為 1 分鐘,任務(wù)隊(duì)列沒(méi)有設(shè)定最大數(shù)量值。
優(yōu)化:
1.任務(wù)隊(duì)列沒(méi)有上限
定時(shí)任務(wù)每次啟動(dòng)都回去數(shù)據(jù)庫(kù)中讀取任務(wù),放入對(duì)列表中,如果一直往任務(wù)隊(duì)列中放,那么任務(wù)隊(duì)列占用的內(nèi)存會(huì)越來(lái)越大,導(dǎo)致服務(wù)器內(nèi)存不足。
解決辦法:定時(shí)任務(wù)在讀取任務(wù)時(shí),先判斷任務(wù)隊(duì)列的大小,比如我這設(shè)置的100個(gè),那么我就不再讀取新的任務(wù)了。這個(gè)參數(shù)需要通過(guò)觀(guān)察機(jī)器的負(fù)載,然后來(lái)調(diào)整。
2.線(xiàn)程池中的線(xiàn)程,無(wú)限循環(huán)處理任務(wù),當(dāng)任務(wù)數(shù)量過(guò)多的時(shí)候,線(xiàn)程會(huì)一直執(zhí)行,停不下來(lái)。
線(xiàn)程池中的線(xiàn)程,無(wú)限循環(huán)處理任務(wù),當(dāng)任務(wù)數(shù)量過(guò)多的時(shí)候,線(xiàn)程會(huì)一直執(zhí)行,停不下來(lái)。
解決辦法:在線(xiàn)程內(nèi)部設(shè)置計(jì)數(shù)器,當(dāng)一個(gè)線(xiàn)程累計(jì)到一定數(shù)量,退出循環(huán),然后清空資源,回收,間歇性,周期的執(zhí)行任務(wù),相當(dāng)于定期回收資源
3.定時(shí)任務(wù) 1 分鐘,那么空閑線(xiàn)程存活的時(shí)間為1分鐘
由于空閑線(xiàn)程存活時(shí)間是 1 分鐘,那么我的定時(shí)任務(wù)也是 1 分鐘,這個(gè)時(shí)候,線(xiàn)程就基本就不會(huì)被線(xiàn)程池回收,那么資源就一直沒(méi)有釋放,被回收。
解決辦法:調(diào)整線(xiàn)程空閑的線(xiàn)程存活時(shí)間為定時(shí)任務(wù)周期的一半,也就是30秒。
4.在線(xiàn)程池中,有核心線(xiàn)程,對(duì)于核心線(xiàn)程超時(shí)也回收,所以,需要執(zhí)行下邊這個(gè)方法,確保核心線(xiàn)程超時(shí)之后也被回收。
解決辦法:threadPoolExecutor.allowCoreThreadTimeOut(true);
優(yōu)化之后的流程:
任務(wù)定期讀取任務(wù),往任務(wù)隊(duì)列中放一定量(不能超過(guò)最大值)的任務(wù),之后線(xiàn)程池中的線(xiàn)程超時(shí)時(shí)間設(shè)置短一點(diǎn),線(xiàn)程通過(guò)計(jì)數(shù)器,當(dāng)執(zhí)行了一定數(shù)量的線(xiàn)程之后,推出循環(huán),這個(gè)時(shí)候線(xiàn)程就空閑了,后邊就會(huì)被線(xiàn)程池回收,資源被回收,如此反復(fù)進(jìn)行下去,資源回收,重新分配,不會(huì)大量消耗服務(wù)資源。
通過(guò)以上幾個(gè)點(diǎn)的優(yōu)化,程序消耗服務(wù)器資源好很多,可能還有優(yōu)化的地方,后邊再補(bǔ)充。
總結(jié)
以上是生活随笔為你收集整理的java 线程池 资源回收_JAVA线程池资源回收的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spring boot controll
- 下一篇: 流式计算storm核心组件介绍以及入门案