java - Java中线程用户时间和线程CPU时间的区别

标签 java jmx

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

两者有什么区别?

<小时/>

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

更新:这里有一些代码,我试图用它们来了解这些时间的含义,但收效甚微:

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 吗?

最佳答案

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

获取ThreadCpuTime

If the implementation distinguishes between user mode time and system mode time, the returned CPU time is the amount of time that the thread has executed in user mode or system mode.

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

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

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

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

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

以及对 User Mode vs Kernel Mode 的更清晰引用

关于java - Java中线程用户时间和线程CPU时间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1001248/

相关文章:

Java邮件 : How to use different SOCKS5 for different threads?

java - Eclipse 插件作为文件夹而不是 jar

java - 接收 JMeter 需要 saveservice 属性文件才能继续错误

docker - 如何监控在 Bluemix 容器组中运行的 JVM?

java - 获取自己的 MBean 的所有已注册实例

java - 确定 FirefoxProfile 是否接受不受信任的证书

javascript - 如何将文件从 JavaScript 发送到 Java WebService

java - Append Method Linked List...它不断删除最后一个输入

java - 以编程方式访问 Infinispan MBean

java - 连接到远程 JMX 代理 ActiveMQ Artemis 时出错