2010-07-18 77 views

回答

12

這些都不會給你很大的可擴展性。線程佔用相當多的空間 - 例如默認情況下,32位系統上的堆棧大小爲256K,因此對於3000位用戶,只需啓動3000個線程就需要750MB,這是在他們爲數據分配任何內存以完成實際工作之前。

線程每用戶將對可用的用戶數量進行硬性限制,與服務器可能用不同的設計處理的數量相比,這可能是人爲低的。每個區域的線程在這方面可能會稍微好一點,但它也可能會限制區域的數量。

大量的線程有重大的任務切換開銷。爲了避免這種情況,我會嘗試從設計中刪除線程的「所有權」,並使用工作池代替,如ExecutorService。遊戲處理被分解爲您隨後提交給池的工作單元。該池通常設置爲允許與內核數量相同的線程數,以便獲得最高效的執行。 (如果線程是I/O綁定的,則可以使用比內核多的線程。)

+1

256K作爲默認是相當保守的。我認爲它在Windows上更像是1MB?和一些Linux系統上的8MB?這點仍然存在。 +1! – Arafangion 2010-07-20 04:08:48

+0

感謝您的投票。在Windows上的默認值是256K,在其他一些平臺上的默認值更大,但我不確定高達8MB。請參閱http://forums.sun.com/thread.jspa?threadID=649476,以及http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp上的-XX:ThreadStackSize熱點參數 – mdma 2010-07-20 10:44:12

0

一般來說,線程不會放大。使用3000多個線程會出現嚴重的性能問題。

相關問題