【问题标题】:Difference between thread user time and thread cpu time in JavaJava中线程用户时间和线程cpu时间的区别
【发布时间】:2009-06-16 12:43:27
【问题描述】:

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?

【问题讨论】:

  • 我更新了我的帖子,以包含有关 WIN32 下的值含义的更多信息。

标签: java jmx


【解决方案1】:

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

getThreadCpuTime

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

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

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

在 Win32 上,返回值应该与您从 GetThreadTimes Function 获得的值相同

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

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

还有更明确​​的参考User Mode vs Kernel Mode

【讨论】:

  • 而用户模式和系统模式之间的区别将是“Java 代码”与......什么?
  • en.wikipedia.org/wiki/User_mode 换句话说,系统模式 = 运行操作系统和内核级进程所花费的时间,用户模式 ​​= 运行作为应用程序一部分的代码所花费的时间
【解决方案2】:

javadocs 中有解释:-)。

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

获取线程用户时间: 返回指定 ID 的线程在用户态执行的 CPU 时间。

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

【讨论】:

  • 除非您能证明其他情况(然后我会投票),否则您的回答似乎具有误导性。根据我自己的测量,getThreadUserTime 调用的增量值大于getThreadCpuTime,这与您的答案相矛盾。
  • @HendyIrawan:是的,这很奇怪,与我的回答相矛盾。但是,我的回答是官方记录的,我从未见过你描述的现象,所以我坚持。如果您从 getThreadUserTime 得到奇怪的结果,请考虑提出单独的问题。
  • @HendyIrawan:另请注意,投票最多、被接受的答案是相同的,即getThreadUserTimegetThreadCpuTime。
猜你喜欢
  • 2020-04-23
  • 2018-03-19
  • 2020-01-17
  • 1970-01-01
  • 2013-04-05
  • 2010-12-28
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
相关资源
最近更新 更多