2013-04-13 2 views
0

У меня есть типичный условной переменной, реализованный в Явы фундаментальной синхронному/ожидания:High CPU в Object.wait()

ConcurrentHashMap incompleted = ...; 

// the notifier 
incompleted.remove(key); 
synchronized (this) { 
    if (incompleted.isEmpty()) { 
    notifyAll(); 
    } 
} 

// the waiter 
synchronized (this) { // one this object for each request 
    while (!incompleted.isEmpty()) { 
    wait(10000L); // this is exact time out pass in 
    } 
    // done and exit 
} 

Эти коды выглядят очень типичны и работа. Тем не менее, когда я тестирую со многими (скажем 100) одновременными запросами, загрузка процессора составляет около 80%, а профилировщик сообщает в 80% случаев, когда приложение тратится на метод wait(). Обычно высокий процессор может быть вызван ожирением в коде приложения. Но почему бы ждать() себя всю жизнь? Спасибо

Хост является хостом VMware, работающим под управлением Oracle JVM 1.6.

+0

Это просто эксперимент? Потому что, если это настоящий код, вы должны использовать новые 'Lock' и' Condition', а не 'synchronized' и' wait'/'notify'. –

+0

Почему @ bmorris591? Что случилось со стандартными механизмами? – Gray

+0

@Gray Нет ничего плохого в них, но новые механизмы теперь принимаются в лучшую практику. –

ответ

3

Почему бы ждать() сам проводил все время?

Это может быть, что ваш профайлер показывает ваше время на стене часы и не циклов процессора. Ваши потоки проводят большую часть времени в wait(), да, но не потребляют ресурсы ЦП, делая это.

Если профайлер является циклов, показывающий CPU, то вы должны рассмотреть вопрос о переходе на notify() вместо notifyAll(). Если только один поток сможет отключить что-то, нет причин пробуждать все 100 ваших потоков.

+0

hmm .. я могу попробовать. хотя на самом деле существует только один поток. Это также маловероятно, проблема профайлера как такового, так как система также сообщает о высоких расходах процессора. Это не высокий процент низкой общей загрузки процессора. –

0

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

Смежные вопросы