曾经,我通过 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()
不正确?