我有一個程序啓動並創建一個內存中的數據模型,然後創建一個(命令行指定的)線程數,以針對輸入集和該數據模型運行多個字符串檢查算法。工作在輸入字符串集中的線程之間進行劃分,然後每個線程迭代相同的內存數據模型實例(不再更新,因此沒有同步問題)。爲什麼我的多線程Java程序不能最大化我的機器上的所有內核?
我在帶有2個quadcore處理器的Windows 2003 64位服務器上運行它,並且從查看Windows任務管理器,它們沒有被超出,(它們也沒有看起來像是特別徵稅)當我運行10個線程。這是正常的行爲嗎?
看來,7個線程都完成了類似的時間量類似的工作量,所以,你會推薦7個線程,而不是運行?
我應該有多個線程運行呢?......雖然我認爲這可能是有害的,因爲JVM將做更多的上下文中的線程之間的切換。
或者,我應該用更少的線程運行它嗎?
另外,什麼是我可以用來衡量這個最好的工具?......一個分析工具是否會幫助我在這裏 - 事實上,這是幾個分析器之一更好地檢測瓶頸(假設我在這裏有一個)比其他的?
注意,服務器也運行SQL Server 2005(這可能會或可能不相關),但沒有什麼是發生該數據庫上,當我運行我的程序。
還要注意,線程只是做字符串匹配,他們沒有做任何I/O或數據庫的工作或其他任何他們可能需要等待。
它真的是quadcore,還是隻有4個邏輯處理器與HT(2核心,每個2線程)? – Lucero 2010-04-08 15:24:56
@Lucero,我怎麼能說出來?該服務器是IBM X3400,採用2枚Xeon E5320 1.86 GHz芯片。我相信他們是quadcore,我也只是看了一下wikipedia - http://en.wikipedia。org/wiki/Xeon - 我認爲這證實了它,但是如果這些是E5320,那麼很高興能被證明,否則 – 2010-04-08 15:33:18
,那麼你沒有HT支持,我的評論並不重要。使用HT時,CPU基本上保持每個內核有兩個線程上下文,因此,如果線程停頓(例如,在內存訪問等情況下),並且因爲HT配置中的純計算能力不同於其他線程,兩個真正的核心 – Lucero 2010-04-08 16:14:30