2011-12-28 111 views
10

我正在使用JProfiler来分析我的应用程序,结果在“CPU Views”部分显示,超过40%的CPU时间花费在Object.wait()上。不过据我所知,Object.wait() CPU没有提供给等待的线程。CPU使用率和Object.wait

有人可以帮助理解发生了什么,以及为什么探查器显示这么多的CPU花费在Object.wait()上?

+0

您是使用多个线程还是只使用一个?这是一个GUI应用程序或服务器? – Kylar 2011-12-28 14:07:19

+0

这是一个非GUI应用程序,它包含许多线程 - 介于40到60个线程之间。一些线程正在等待网络I/O,另一些线程正在等待响应使用I/O接收的请求。 – Faramarz 2011-12-28 14:12:24

回答

6

wait()中,分析器不知道CPU处于空闲状态。探查器知道的所有信息是输入wait(),并在几毫秒后返回。所以,如果这些毫秒时间占用你执行时间的40%,那么你就有它。

+0

取决于探查器。例如,YourKit肯定知道测量CPU时间:http://www.yourkit.com/docs/10/help/times.jsp – 2011-12-28 14:51:12

+0

@EliAcherkan是的,我甚至不知道jprofiler不知道这一点;但没有其他解释。我唯一可以推测的另一件事是,如果你有一个线程在一个紧密的循环中什么也不做,除了'wait()'和另一个线程在紧密循环中什么也不做,而是'notify()',那么我认为它可能是'wait ()'实际上占用了CPU的很大一部分,并不是因为它本身很昂贵,而是因为我们不会做其他任何事情。但这是不太可能的。 – 2011-12-28 14:59:23

2

40%是什么?假设你简介下面的代码:

for (i = 0; i < 1000; i++){ 
    sleep(1); 
} 

如果您在CPU时间(不挂钟时间)只能看,几乎所有的它会在sleep

为什么?由于它使用的CPU时间非常短,但CPU使用时间为的是,nealy全部用于进入和离开sleep

当然,如果你看看挂钟时间,更多的时间将在sleep

对于任何阻止呼叫也是如此,如wait

+0

谢谢大家。我会尝试像YourKit这样的另一个分析器来查看它告诉我的内容。 – Faramarz 2011-12-29 04:07:16