0

曾经,我通过 Async-profiler(CPU 利用率)分析了 Java 应用程序。Adnrei Pangin(apangin) 感谢异步分析器!

这是堆栈(热方法)位于顶部:

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

这是位于 CPU 报告顶部的 Java 代码: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根本不应该消耗 CPU,因为线程在没有自旋循环的情况下停车。但它做到了这一点。

这是正常情况还是我的代码queue.poll()不正确?

4

0 回答 0