Java中线程用户时间和线程cpu时间的区别

时间:2009-06-16 12:43:28

标签: java jmx

ThreadMXBean有两种检索线程时间使用的方法:

两者有什么区别?


更新2 :如果我能够链接到javadocs,不引用它们 - 我已经阅读过了。

更新:这是我试图用来了解这些时间的意思的一些代码,但收效甚微:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
threadMXBean.setThreadContentionMonitoringEnabled(true);
long mainThreadId = getMainThreadId(threadMXBean);

logTimes("Start", threadMXBean, mainThreadId);

URL url = new URL("https://hudson.dev.java.net");
URLConnection connection = url.openConnection();

connection.getContent();

logTimes("After loading", threadMXBean, mainThreadId);

,输出为:

Start Tue Jun 16 16:13:40 EEST 2009 Cpu time : 80, user time: 60, waited: 0, blocked: 0
After loading Tue Jun 16 16:13:43 EEST 2009 Cpu time : 1,020, user time: 960, waited: 0, blocked: 0

因此,cpu和用户时间之间的差异从20毫秒增加到60毫秒。是因为使用HttpUrlConnection确实包含一些网络I / O吗?

2 个答案:

答案 0 :(得分:8)

由于您链接到自己的API文档已经指出

<强> getThreadCpuTime

  

如果实现有区别   在用户模式时间和系统模式之间   时间,返回的CPU时间是   线程的时间量   在用户模式或系统模式下执行。

如果JVM的实现区分用户模式和内核模式时间,则两个函数的结果可能会有所不同。

此外,该值仅精确到纳秒,并且如果偏移> 1,则该值具有溢出问题。 2 ^ 63。 JVM还必须支持测量当前线程的CPU时间,并且必须启用它。

在Win32上,返回值应与从GetThreadTimes Function

获得的值相同

getThreadUserTime() - &gt; lpUserTime * 100 //或类似的东西

getThreadCpuTime() - &gt; (lpKernelTime + lpUserTime) * 100 //或类似的东西

更清楚地提及User Mode vs Kernel Mode

答案 1 :(得分:-1)

在javadocs中解释: - )。

  

getThreadCpuTime:   返回指定ID的线程的总CPU时间。

     

getThreadUserTime:   返回指定ID的线程在用户模式下执行的CPU时间。

不同之处在于getThreadCpuTime还包括线程使用CPU但未处于用户模式的时间。这就像是在设备驱动程序内部,轮询I / O或类似事件。