亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

由于接收超時和任務執行器不協調而導致內存泄漏

由于接收超時和任務執行器不協調而導致內存泄漏

江戶川亂折騰 2023-07-13 13:57:01
我正在瀏覽 spring 集成參考文檔,在第 10.1.8 節異步輪詢中,它寫道,不協調的 conf 可能會導致內存泄漏。根據下面的文檔,conf 不協調:<int:channel id="publishChannel">? ? <int:queue /></int:channel><int:service-activator input-channel="publishChannel" ref="myService">? ? <int:poller receive-timeout="5000" task-executor="taskExecutor" fixed-rate="50" /></int:service-activator><task:executor id="taskExecutor" pool-size="20" />我在理解本節時遇到困難,因為它寫的是每秒將執行 4 個線程,因為每個線程將等待 250 毫秒,并且任務將以每秒 20 個的速度添加。任務執行器是否應該只分配 1 個線程來等待傳入消息,并且應該啟動最大線程以防隊列中有足夠的任務?另外,為什么每秒只有 4 個線程執行,如果任務花費超過 250 毫秒怎么辦?如果它太簡單并且我錯過了一些微不足道的東西,請道歉。
查看完整描述

1 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

<task:executor id="taskExecutor" pool-size="20" />是一個無界的任務隊列。這是默認的。

task-executor="taskExecutor" fixed-rate="50"意味著不會阻塞調度程序的線程,并且調度程序每 50 毫秒啟動一次新的輪詢!它的發生確實與publishChannel內容無關。我的意思是新任務總是被放入taskExecutor隊列中。

如果下游進程確實足夠長,則20執行器的所有線程都會很忙,并且任務的內部隊列將會增長。這就是內存泄漏最嚴重的地方。

1 秒/ 50 毫秒 = 每秒 20 個任務。

如果 中沒有消息publishChannel,我會說任務執行器中的所有線程都將忙于等待 5 秒超時。那么,任務的完成率是多少呢?20 active tasks / 5000 millis to wait for their finish = 4 per second。

這個故事與4 個線程無關,而是在實際情況下我們能夠以多快的速度耗盡任務隊列。


查看完整回答
反對 回復 2023-07-13
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號