2011-10-11 65 views
0

我參與了使用多線程的項目。每次通話都會產生4-5個線程(該系統是爲出租車呼叫中心開發的)。這裏的問題是,在閱讀JMS隊列中的信息之後,一個新的線程必須產生,這不會發生。此問題隨機發生。我建議在StackOverflow中使用I earlier posted similar question進行加載注入。java中的多線程問題

在研究了加載注入之後,我認爲,在我的開發服務器中進行測試是不可行的,因爲我的系統將通過控制用戶訪問的調用流進行訪問。我花了一些時間研究JVM調優和線程池。對於這個特定的系統進程,大約每天14K-15K次呼叫,在高峯時間內,隊列將會非常高(可能會在隊列中等待400-500個呼叫),每次調用4-5個線程都必須產生。從日誌中我沒有看到OutOfMemoryError之類的東西。 有沒有其他的原因可能會阻止線程的產卵?

我的JVM conf是xms:128m Xmx:1024m 環境是windows server 32bit,4GB ram。

將包括threadstacksize幫助產卵的線程沒有任何障礙?

我也在研究線程池的可行性。在產生固定數量的線程時,我需要研究它是否會影響系統的整體性能?

+0

操作系統限制可以同時激活的線程數並不是不可能的。不把它放在答案中,因爲我不確定這是如何影響JVM的(例如,如果他們做了任何事情來隱藏用戶代碼的限制)。 – Romain

+0

我肯定會推薦使用線程池路由,請參閱http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int) – Qwerky

回答

0

創建一個線程是一個非常昂貴的操作並使用了大量的系統資源。最重要的是每個線程都需要大量內存(默認情況下爲512 kB)。如果你過分地創建新線程,你會遇到各種各樣的問題。 JVM通常只能支持幾千個線程,具體取決於操作系統,-XX:ThreadStackSize設置和可用內存。

線程池不會讓你的性能變差,它會使它變得更好。所以你絕對應該這樣。如果你的線程池太小,你可能會遇到一些生存問題,但這很容易調整。

+0

我同意你的意見關於限制。但是,有什麼方法可以找出操作系統正在處理的活動線程數量。 – AKV

+0

使用分析器,例如[JProfiler](http://www.ej-technologies.com/products/jprofiler/overview.html)或[visualvm](http://visualvm.java.net/) –

0

也許體系結構的變化可以幫助解決問題 - 我會嘗試線程池,因爲它的效率很高,但單靠它並不能保證解決問題。如果確實需要所有衍生的線程,則需要重新考慮(具有多個線程競爭單個資源的性能影響),並且調整池的大小。看看Executor,它可以幫助你做一些改變。

+0

無法考慮因爲這個項目是由其他人開發的,所以重新構建了架構。他辭職時我接管了他。現在還在生產。 ü看到我的問題卡住了一些。必須有一些如何解決這個問題。 – AKV