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

Rob*_*anu 4 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);
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

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

jit*_*ter 8

正如您自己链接的API文档已经指出的那样

getThreadCpuTime

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

如果JVM的实现区分用户模式和内核模式时间,则两个函数的结果可能存在差异.

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

在Win32上,返回值应与从GetThreadTimes函数获得的值相同

getThreadUserTime()- > lpUserTime * 100//或类似的东西

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

并且更清楚地提到用户模式与内核模式

  • http://en.wikipedia.org/wiki/User_mode 换句话说,系统模式 = 运行操作系统和内核级进程所花费的时间,用户模式 ​​= 运行应用程序一部分的代码所花费的时间 (2认同)