2011-12-28 107 views
10

我正在使用JProfiler來分析我的應用程序,結果在「CPU Views」部分顯示,超過40%的CPU時間花費在Object.wait()上。不過據我所知,Object.wait() CPU沒有提供給等待的線程。CPU使用率和Object.wait

有人可以幫助理解發生了什麼,以及爲什麼探查器顯示這麼多的CPU花費在Object.wait()上?

+0

您是使用多個線程還是隻使用一個?這是一個GUI應用程序或服務器? – Kylar 2011-12-28 14:07:19

+0

這是一個非GUI應用程序,它包含許多線程 - 介於40到60個線程之間。一些線程正在等待網絡I/O,另一些線程正在等待響應使用I/O接收的請求。 – Faramarz 2011-12-28 14:12:24

回答

6

wait()中,分析器不知道CPU處於空閒狀態。探查器知道的所有信息是輸入wait(),並在幾毫秒後返回。所以,如果這些毫秒時間佔用你執行時間的40%,那麼你就有它。

+0

取決於探查器。例如,YourKit肯定知道測量CPU時間:http://www.yourkit.com/docs/10/help/times.jsp – 2011-12-28 14:51:12

+0

@EliAcherkan是的,我甚至不知道jprofiler不知道這一點;但沒有其他解釋。我唯一可以推測的另一件事是,如果你有一個線程在一個緊密的循環中什麼也不做,除了'wait()'和另一個線程在緊密循環中什麼也不做,而是'notify()',那麼我認爲它可能是'wait ()'實際上佔用了CPU的很大一部分,並不是因爲它本身很昂貴,而是因爲我們不會做其他任何事情。但這是不太可能的。 – 2011-12-28 14:59:23

2

40%是什麼?假設你簡介下面的代碼:

for (i = 0; i < 1000; i++){ 
    sleep(1); 
} 

如果您在CPU時間(不掛鍾時間)只能看,幾乎所有的它會在sleep

爲什麼?由於它使用的CPU時間非常短,但CPU使用時間爲的是,nealy全部用於進入和離開sleep

當然,如果你看看掛鐘時間,更多的時間將在sleep

對於任何阻止呼叫也是如此,如wait

+0

謝謝大家。我會嘗試像YourKit這樣的另一個分析器來查看它告訴我的內容。 – Faramarz 2011-12-29 04:07:16