2012-03-16 136 views
3

我使用一個線程池,應該是能夠執行數百個並行任務。然而,這些任務通常只執行很少的計算,並且大部分時間都花在等待某些服務器響應上。因此,如果線程池大小包含數百個線程,則只有少數線程處於活動狀態,而大多數線程將等待。線程池與許多阻塞任務

我知道,一般這不是線程池使用一個很好的做法,但目前的設計不允許做我的任務異步,使他們能夠無需等待服務器的響應返回控制。所以考慮到這個限制,我想我最大的問題是線程堆棧空間的內存消耗增加。

那麼,有沒有辦法用某種輕量線程不會佔用多少內存?

我現在有一個JVM選項-Xss來控制堆棧內存,但似乎沒有辦法控制每個線程池或線程,而不是改變VM內的所有線程,對嗎?

而且你有一個更好的解決我的問題有什麼建議?

+0

從我所瞭解的這個線程執行網絡通信? – 2012-03-16 13:39:34

+0

是的,但不幸的是我沒有通信層的低級控制。 – Lobachevsky 2012-03-19 15:05:08

+0

只需注意:如果線程的總數實際上受到關注,則緩存的緩衝池似乎非常適合您的用例。高速緩存將允許在活動高峯時重新使用線程,並且生存時間將允許它們在給定的時間量之後停止(從而釋放資源)。這可以緩解這些問題(如果你真的有一個,例如1000個線程在典型的當前硬件上是完美的)。 – GPI 2017-08-10 14:21:36

回答

2

我知道,一般這不是線程池的使用

我不同意一個好的做法。我認爲這是一個完美的做法。您是否看到這種方法存在問題,因爲否則,從標準線程切換,過早優化到我?

那麼有沒有什麼方法可以使用某種輕量級的線程,不佔用太多內存?

我想你已經在那裏了。線程已經相對輕量級了,除非你在一個非常有限的JVM中工作,否則我沒有理由擔心其中的數百個線程。

你也有任何建議,以更好地解決我的問題?

的任何解決方案,我看到的將是一個很多更加複雜,並會再次過早優化的定義。例如,您可以使用NIO並在服務器響應可用時執行您自己的線程調度,但這是您可以通過線程免費獲得的事情。

+0

>我不同意。我認爲這是一個完美的做法。你看到這種方法的問題,因爲這對我來說過早優化? – Lobachevsky 2012-03-19 14:49:47

+0

(請忽略我上面的評論,這是錯誤的)我還沒有觀察到任何真正的問題,但我看到通常我的線程池有大約500個線程,一次只有一個或兩個線程處於活動狀態。現在我需要增加線程池的限制,可能超過1000,所以我很擔心內存開銷。 – Lobachevsky 2012-03-19 14:59:02

+0

您可以通過點擊X @ Kostadin來殺死該評論。如果你發現記憶有問題,或者懷疑發生抖動,那麼我會處理它。一個好的分析器也會告訴你,如果你有問題。我在測試中創建了2k個線程,佔用了<3mb的內存,所以線程的數量不應該成爲問題。 – Gray 2012-03-19 15:04:11

1

那麼有沒有什麼方法可以使用某種輕量級線程,而不會消耗太多內存?

在線程池中使用普通線程很可能重量輕。

我現在有一個JVM選項-Xss控制堆棧內存,但它似乎沒有辦法來控制這種每線程池或僅線程,而不是改變它的虛擬機中的所有線程,對不對?

這是每個線程的最大尺寸。它的大小,你想要得到一個StackOverFlowError而不是繼續運行。恕我直言,沒有什麼好處在每個線程的基礎上進行調整。

線程堆棧使用主存儲器實際使用的部分和其餘的虛擬內存。如果您有64位JVM,虛擬內存便宜。如果這是一個問題,我會切換到64位。

你也有任何建議,以更好地解決我的問題?

如果您有數千個線程,您可能會考慮使用非阻塞IO。聽起來你不需要擔心。在我所做的測試中,擁有10,000個活動線程會佔用一個CPU(如果線程無法執行任何操作)對於每百個線程,您可能會浪費1%的CPU。如果您有空閒的CPU,這不太可能是個問題。

+0

好的,在這種情況下,我會做一些增加線程池大小的測試,看看是否有任何問題。我沒有注意到-Xss只是最大尺寸。那應該沒問題。 – Lobachevsky 2012-03-19 15:02:55