Почему высокая загрузка ЦП во время 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() это неверно?

0 ответов

Другие вопросы по тегам