【发布时间】:2013-06-23 14:12:04
【问题描述】:
我正在尝试使用 JMX 来测量方法调用花费了多长时间以及其中有多少是 CPU 时间、线程被阻塞了多少以及等待了多少。理想情况下,我希望 CPU 时间 + 阻塞时间 + 等待时间 = 挂起时间,但我注意到情况并非如此 - 而且不仅仅是计时器稍微不准确。例如:
Wall time: 5657.305 ms
CPU time: 4060.000 ms (71.77%)
User time: 3840.000 ms (67.88%)
Block time: 0.000 ms (0.00%)
Wait time: 0.000 ms (0.00%)
所以,问题是......我的假设是这些时间的总和(不是用户时间,它包含在 CPU 时间中)应该给 Wall time 错误? 我错过了什么吗?
更多细节:
Wall time:方法进入和退出时
System.currentTimeMillis()的差异CPU时间:方法进入和退出时
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()的差异阻塞和等待时间:类似于 CPU,
ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId()).getBlockedTime()和getWaitedTime()是的,我确实知道这些方法以不同的单位 (ns/ms) 返回时间,我考虑到了这一点。
应用程序是高度超线程的(4000 多个线程),但我存储每个线程的所有信息,因此不应该来自不同线程的调用之间有任何干扰。
【问题讨论】: