CPU 使用率和 Object.wait
Posted
技术标签:
【中文标题】CPU 使用率和 Object.wait【英文标题】:CPU Usage and Object.wait 【发布时间】:2011-12-28 14:05:36 【问题描述】:我正在使用 JProfiler 分析我的应用程序,结果,在“CPU 视图”部分它显示超过 40% 的 CPU 时间花费在 Object.wait()
上。但是,据我所知,Object.wait()
CPU 没有分配给等待线程。
有人可以帮助了解发生了什么以及为什么分析器显示这么多 CPU 花费在 Object.wait()
上吗?
【问题讨论】:
您是使用多个线程还是只使用一个?这是 GUI 应用程序还是服务器? 这是一个非 GUI 应用程序,包含许多线程 - 40 到 60 个 - 线程。一些线程正在等待网络 I/O,而另一些线程正在等待响应使用 I/O 接收的请求。 【参考方案1】:分析器不知道 CPU 在wait()
中处于空闲状态。分析器只知道输入了wait()
,几毫秒后它返回了。因此,如果这些毫秒往往会占用您 40% 的执行时间,那么您就有了。
【讨论】:
取决于分析器。例如,YourKit 肯定知道测量 CPU 时间:yourkit.com/docs/10/help/times.jsp @EliAcherkan 是的,我什至不确定 jprofiler 不知道;但没有其他解释。我唯一可以推测的另一件事是,如果您有一个紧密循环中的线程除了wait()
什么都不做,而另一个紧密循环中的线程除了notify()
什么都不做,那么我想wait()
实际上很可能会消耗很大比例的 CPU,不是因为它本身很昂贵,而是因为我们不会真正做任何其他事情。但这不太可能。【参考方案2】:
40% 什么?假设您分析以下代码:
for (i = 0; i < 1000; i++)
sleep(1);
如果您只查看 CPU 时间(而不是挂钟时间),那么几乎所有时间都在 sleep
中。
为什么?因为它使用的 CPU 时间非常少,但在它正在使用的 CPU 时间中,几乎所有的时间都花在了进入和离开 sleep
上。
当然,如果您查看挂钟时间,sleep
中的时间会更多。
任何阻塞调用也是如此,例如wait
。
【讨论】:
谢谢大家。我会尝试另一个分析器,比如 YourKit,看看它告诉我什么。【参考方案3】:JProfiler 区分各种线程状态。等待方法的显示时间取决于 CPU 视图右上角的线程状态选择器。请参阅http://blog.ej-technologies.com/2009/07/thread-states-in-cpu-profiling-views.html 了解更多信息。
【讨论】:
以上是关于CPU 使用率和 Object.wait的主要内容,如果未能解决你的问题,请参考以下文章
object.wait为什么要和synchronized一块使用