日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 线程池 资源回收_JAVA线程池资源回收的问题

發(fā)布時(shí)間:2024/7/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 线程池 资源回收_JAVA线程池资源回收的问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近項(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。