1

我寫了一個計算量很大的單線程程序,但是當我執行它時,我驚訝地發現我的四核處理器的利用率爲95%。我期待看到一些接近25%的利用率(一個核心)。我使用Process Explorersysinternals,並進一步驚訝地發現Java進程有六個線程,負載分佈幾乎相同,總處理器時間約爲16%。Java是否具有自動並行?

最初我打算並行化我的代碼,但現在看起來我不會獲得任何性能,因爲即使使用非並行代碼,CPU的負載已經達到了95%。

它似乎幾乎自動並行我的代碼,但網上的一切都告訴我,這不可能是真的。有誰知道發生了什麼事?

編輯:我加了一些截圖,希望能夠回答以下一些問題:在怠速

系統 - 1%的負荷。我使用的是具有8個邏輯內核的四核CPU。 System at Idle

我的非並行java程序正在運行。請注意,所有4個內核幾乎刷爆: run

工具有Sysinternals我不平行的java程序的視圖。請注意具有幾乎相同負載的8個線程: procexp

+1

大多數系統顯示使用情況爲一個CPU完全使用的百分比。因此,在充分利用時,您的計劃將達到400%。不知道這是否是你的問題,但它肯定是可能的,你只是曲解。 – Others

+2

也可以使用專用的Java工具,如jmc,jconsole或jstat來查看正在發生的事情。它可能是Java堆接近OutOfMemory,從而導致GarbageCollector燒錄CPU。 –

+0

嗨史蒂夫,你在所有CPU核心中的使用率是95%嗎? –

回答

-4

Java不會並行化您的代碼。 Java正在並行化。記住Java在虛擬機中運行。該虛擬機本身就是一個程序。

2

在我使用的大多數系統中,使用率百分比實際上是該進程使用的一個內核功耗的百分比。如果你的系統是這樣的,你只是誤解了使用百分比。也就是說,java正在使用CPU的95%的一個一個 CPU。不知道這是怎麼回事,但它可以解釋一個無並行程序如何顯示在95%。

編輯:根據您的編輯,這似乎並非如此。也許就像@a_horse_with_no_name在評論中暗示的那樣,你的代碼是使用並行流還是另一個自動並行操作?

+0

否。Windows任務管理器報告所有核心的CPU使用情況。使用8個內核,單個完全繁忙的內核將導致任務管理器的CPU使用率爲12%。第二個屏幕截圖還顯示了所有8個內核都很忙,而不僅僅是一個。 –

+0

@a_horse_with_no_name在添加他的編輯之前,我做了我的回答... – Others

相關問題