Использование процессора и 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.