Почему высокая загрузка ЦП во время ArrayBlockingQueue.poll()
Однажды я профилировал Java-приложение с помощью Async-profiler (загрузка процессора). Аднрей Пангин (апангин) благодарит за асинхронный профилировщик!
Это стек (горячие методы) был наверху:
Started [itimer] profiling
--- Execution profile ---
Total samples : 6443
unknown_Java : 17 (0.26%)
not_walkable_Java : 2 (0.03%)
thread_exit : 1 (0.02%)
Frame buffer usage : 42.4103%
--- 1710000000 ns (2.65%), 171 samples
[ 0] __pthread_cond_timedwait
[ 1] Unsafe_Park
[ 2] jdk.internal.misc.Unsafe.park
[ 3] java.util.concurrent.locks.LockSupport.parkNanos
[ 4] java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos
[ 5] java.util.concurrent.ArrayBlockingQueue.poll
[ 6] xx.Service.run
[ 7] java.lang.Thread.run
Это Java-код, который был в верхней части отчета CPU: xx.Service.class:
public void run() {
try {
while (execute) {
Event event = queue.poll(100, TimeUnit.MILLISECONDS);
if (event == null) {
continue;
}
do_something();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
«Очередь» - это ArrayBlockingQueue, потому что она используется из разных потоков Java.
На мой взгляд, функция
__pthread_cond_timedwait
вообще не должен потреблять ЦП, потому что поток парковался без цикла вращения. Но он делает это.
Это нормальная ситуация или мой код с
queue.poll()
это неверно?