這些事情顯然需要仔細檢查並提供代碼才能徹底分析並提供良好的建議。儘管如此,這並不總是可行的,我希望可以根據我在下面提供的信息向我提供好的建議。Java內存使用情況/線程池性能問題
我有一個服務器應用程序,它使用偵聽器線程來偵聽傳入數據。傳入的數據被解釋爲應用程序特定的消息,然後這些消息引發事件。
到目前爲止,我並不完全控制事情的完成。因爲這是一個遺留應用程序,所以這些事件以前由同一個偵聽器線程(主要是單線程應用程序)負責處理。這些事件被髮送到一個黑盒子,並出現應寫入磁盤的結果。
爲了提高吞吐量,我想使用線程池來處理事件。這個想法是,偵聽器線程可以在每次創建事件時產生新的任務,並且線程將負責黑箱調用。最後,我有一個後臺線程執行寫入磁盤。
使用前面的設置和背景編寫器,一切正常,吞吐量比以前高1.6倍。
當我添加線程池但性能下降。一開始,一切似乎都能順利運行,但過了一段時間後,一切都非常緩慢,最終我得到了OutOfMemoryExceptions。奇怪的是,當我每次將任務添加到池時打印活動線程的數量(以及關於有多少任務排隊等信息),看起來好像線程池沒有問題跟上生產者(監聽器線程)。
使用top -H檢查CPU使用情況,它在開始的時候非常均勻地展開,但最後工作線程幾乎不活動,只有偵聽線程處於活動狀態。但它似乎並沒有提交更多的任務...
任何人都可以推測這些症狀的原因嗎?您認爲在添加多個線程時遺留代碼中有什麼東西(我無法控制)更糟糕嗎?內存不足的問題應該是因爲某個隊列變得太大,但由於線程池幾乎從不包含排隊的任務,所以不可能是這樣。
歡迎任何想法。特別是如何更有效地診斷這種情況的想法。我怎樣才能更好地瞭解我的線程正在做什麼等。
謝謝。
黑盒是終端組件還是連接?它是被動的還是積極的組件?你從哪裏得到線程池? – alphazero
請在黑匣子上提供更多詳情。 – toto2
黑盒子只是一個內部函數,它接受A類型的對象並執行它們的各種操作以產生B類型的對象。這是應用程序的計算部分以及池中的線程執行的內容。線程池是標準的oracle/sun jdk實現。 – UmaN