Почему переход от бесконечного цикла к TimerTask вызвал такое падение использования CPU?

Я написал демон, который был структурирован следующим образом:

while( true ) {
  // do some stuff
  Thread.sleep( 1000 );
}

Я заметил, что он использует очень большое количество CPU - до 100%. У меня был похожий демон на моих рабочих серверах в течение нескольких месяцев с той же проблемой с процессором.

Вчера я переделал код, чтобы использовать TimerTask. Сразу же я заметил, что использование CPU снизилось на моем dev box. Поэтому я решил развернуть код на продакшене и перепроверить его с помощью Munin. Вот графики:

Load average

CPU usage

Пара моментов:

  • На рабочем сервере не запущено абсолютно ничего, кроме JVM.
  • Нет никаких других запущенных потоков приложения
  • Он определенно выполнял код старого стиля с правильными периодическими интервалами - я всегда пишу в журнал каждый раз, когда поток выполняется.

Итак: почему Thread.sleep так неэффективен по сравнению с TimerTask?

10
задан Rob Watson 8 January 2012 в 08:36
поделиться