Загрузка процессора и Object.wait - PullRequest
10 голосов
/ 28 декабря 2011

Я профилировал свое приложение, используя JProfiler, и в результате в разделе «CPU Views» он показывает, что более 40% процессорного времени расходуется на Object.wait().Однако, насколько я знаю, на Object.wait() CPU не передан ожидающему потоку.

Может ли кто-нибудь помочь понять, что происходит и почему профилировщик показывает, что такая большая часть ЦП расходуется на Object.wait()?

Ответы [ 3 ]

6 голосов
/ 28 декабря 2011

Профилировщик не знает, что процессор находится в режиме ожидания, пока находится в wait(). Профилировщик знает только то, что wait() был введен, а через несколько миллисекунд он вернулся. Так что, если эти миллисекунды, как правило, занимают 40% вашего времени выполнения, у вас это есть.

2 голосов
/ 28 декабря 2011

40% чего? Предположим, вы профилируете следующий код:

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

Если вы посмотрите только на процессорное время (не на настенные часы), почти все это будет в sleep.

Почему? Поскольку он использует очень мало процессорного времени вообще, но из процессорного времени, которое он использует , почти все это тратится на вход и выход sleep.

Конечно, если вы посмотрите на время настенных часов, еще больше будет в sleep.

То же самое относится к любому блокирующему вызову, как wait.

0 голосов
/ 31 декабря 2011

JProfiler различает различные состояния потоков.Отображаемое время для метода ожидания зависит от селектора состояния потока в верхнем правом углу представлений ЦП.См. http://blog.ej -technologies.com / 2009/07 / thread-states-in-cpu-profiling-views.html для получения дополнительной информации.

...