2011-12-28 17 views
10

私はJProfilerを使用してアプリケーションをプロファイリングしていました。その結果、「CPU Views」セクションでは、CPU時間の40%以上がObject.wait()に費やされています。しかし、私が知っている限り、Object.wait()待機スレッドにはCPUが与えられていません。CPU使用量とObject.wait

誰かが何が起こっているのかを理解することができます。なぜこのプロファイラは、CPUの多くがObject.wait()に費やされていることを示していますか?

+0

複数のスレッドを使用しているのですか?これはGUIアプリケーションですか、サーバーですか? – Kylar

+0

これは、40〜60スレッドの間に多数のスレッドを含む非GUIアプリケーションです。一部のスレッドはネットワークI/Oを待機しており、他のスレッドはI/Oを使用して受信した要求に応答するのを待っています。 – Faramarz

答えて

6

wait()にある間、プロファイラーはCPUがアイドルであることを認識しません。プロファイラが知っていることは、wait()が入力されたことだけであり、数ミリ秒後に返されます。したがって、それらのミリ秒があなたの実行時間の40%を占める傾向があるなら、あなたはそれを持っています。

+0

プロファイラによって異なります。たとえば、YourKitはCPU時間を正確に測定することができます。http://www.yourkit.com/docs/10/help/times.jsp –

+0

@EliAcherkanはい、jprofilerがそのことを認識していないかどうかはわかりません。他の説明はありません。私が推測できる唯一のもう一つのことは、タイトなループの中に 'wait()'と何もしていないスレッドがあり、 'notify()'以外の何もしないタイトなループのスレッドがあれば、 'wait () 'は実際にCPUの大部分を消費しますが、それ自体が高価なものではなく、他に何もしていないからです。しかし、それは非常にありそうもありません。 –

2

何が40%ですか?次のコードをプロファイルとします

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

あなたがCPU時間(ない壁時計時間)でのみ見ると、ほぼすべてのそれのがsleepになります。

なぜですか? CPU時間はまったくわずかですが、CPU時間はです。を使用しています。そのすべてを入力して終了します。sleep

もちろん、壁時計の時刻を見ると、それ以上のものはsleepになります。

waitのようなブロッキングコールでも同じです。

+0

ありがとうございます。私はYourKitのような別のプロファイラを試して、それが私に何を伝えるのか見てみましょう。 – Faramarz

関連する問題