我正在使用JProfiler来分析我的应用程序,结果在“CPU Views”部分显示,超过40%的CPU时间花费在Object.wait()
上。不过据我所知,Object.wait()
CPU没有提供给等待的线程。CPU使用率和Object.wait
有人可以帮助理解发生了什么,以及为什么探查器显示这么多的CPU花费在Object.wait()
上?
我正在使用JProfiler来分析我的应用程序,结果在“CPU Views”部分显示,超过40%的CPU时间花费在Object.wait()
上。不过据我所知,Object.wait()
CPU没有提供给等待的线程。CPU使用率和Object.wait
有人可以帮助理解发生了什么,以及为什么探查器显示这么多的CPU花费在Object.wait()
上?
在wait()
中,分析器不知道CPU处于空闲状态。探查器知道的所有信息是输入wait()
,并在几毫秒后返回。所以,如果这些毫秒时间占用你执行时间的40%,那么你就有它。
取决于探查器。例如,YourKit肯定知道测量CPU时间:http://www.yourkit.com/docs/10/help/times.jsp – 2011-12-28 14:51:12
@EliAcherkan是的,我甚至不知道jprofiler不知道这一点;但没有其他解释。我唯一可以推测的另一件事是,如果你有一个线程在一个紧密的循环中什么也不做,除了'wait()'和另一个线程在紧密循环中什么也不做,而是'notify()',那么我认为它可能是'wait ()'实际上占用了CPU的很大一部分,并不是因为它本身很昂贵,而是因为我们不会做其他任何事情。但这是不太可能的。 – 2011-12-28 14:59:23
40%是什么?假设你简介下面的代码:
for (i = 0; i < 1000; i++){
sleep(1);
}
如果您在CPU时间(不挂钟时间)只能看,几乎所有的它会在sleep
。
为什么?由于它使用的CPU时间非常短,但CPU使用时间为的是,nealy全部用于进入和离开sleep
。
当然,如果你看看挂钟时间,更多的时间将在sleep
。
对于任何阻止呼叫也是如此,如wait
。
谢谢大家。我会尝试像YourKit这样的另一个分析器来查看它告诉我的内容。 – Faramarz 2011-12-29 04:07:16
JProfiler区分各种线程状态。显示的等待方法的时间取决于CPU视图右上角的线程状态选择器。有关更多信息,请参阅http://blog.ej-technologies.com/2009/07/thread-states-in-cpu-profiling-views.html。
您是使用多个线程还是只使用一个?这是一个GUI应用程序或服务器? – Kylar 2011-12-28 14:07:19
这是一个非GUI应用程序,它包含许多线程 - 介于40到60个线程之间。一些线程正在等待网络I/O,另一些线程正在等待响应使用I/O接收的请求。 – Faramarz 2011-12-28 14:12:24