Использование ЦП и Object.wait

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

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


person Faramarz    schedule 28.12.2011    source источник
comment
Вы используете несколько потоков или только один? это приложение с графическим интерфейсом или сервер?   -  person Kylar    schedule 28.12.2011
comment
Это приложение без графического интерфейса, которое содержит много потоков — от 40 до 60 — потоков. Некоторые потоки ожидают сетевого ввода-вывода, а некоторые другие ожидают ответа на запросы, получаемые с использованием ввода-вывода.   -  person Faramarz    schedule 28.12.2011


Ответы (3)


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

person Mike Nakis    schedule 28.12.2011
comment
Зависит от профайлера. Например, YourKit точно умеет измерять процессорное время: yourkit.com/docs/10 /help/times.jsp - person Eli Acherkan; 28.12.2011
comment
@EliAcherkan Да, и я даже не знаю наверняка, что jprofiler этого не знает; но другого объяснения нет. Единственное, что я могу предположить, это то, что если у вас есть один поток в узком цикле, который не делает ничего, кроме wait(), а другой поток в узком цикле ничего не делает, кроме notify(), то я полагаю, что wait() на самом деле будет потреблять большой процент ресурсов. ЦП не потому, что он дорог сам по себе, а потому, что мы не будем делать ничего другого. Но это маловероятно. - person Mike Nakis; 28.12.2011

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

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

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

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

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

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

person Mike Dunlavey    schedule 28.12.2011
comment
Спасибо всем. Я попробую другой профилировщик, например YourKit, чтобы посмотреть, что он мне скажет. - person Faramarz; 29.12.2011

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

person Ingo Kegel    schedule 31.12.2011