Использование процессора и Object.wait

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

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

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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