java - Thread.sleep()的CPU消耗

标签 java multithreading jvisualvm

在“Sampler”选项卡/CPU 的“CPU Samples”子选项卡下观察,我发现最消耗的方法是 java.lang.Thread.sleepnative。

我有大约 30 个具有相关 sleep() 调用的线程。但这有什么意义呢?

我报告的平均 CPU 消耗是 7%,Thread.sleep() 真的使用了 70% 的时间吗?

怎么可能,是“真实”的消费吗?

最佳答案

通常,采样器只会在每个给定时间检查您的程序正在执行的操作,并报告您的程序在给定方法中运行了多少次(并通过简单的乘法给出了大约多少时间)。

这通常与实际 CPU 负载无关。

例如, sleep() 调用会暂停线程,因此您的代码几乎根本不加载 CPU,但是,如果我有一个程序只启动、 hibernate 10 分钟然后结束,采样它会告诉我 Thread.sleep 消耗了 100% 的 cpu 时间。

这同样适用于 IO 操作,其中您的线程正在等待数据从某个地方(可能是远程互联网主机,或者只是您的磁盘)到达,并且不会显着加载 CPU,但采样器仍然会(正确地)告诉你大部分时间都花在了 IO 方法上,即使 CPU 本身并没有做那么多。

关于java - Thread.sleep()的CPU消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25749512/

相关文章:

java - org.hibernate.LazyInitializationException : could not initialize proxy - no Session , 表示没有 getter,但我的 getter/setter 存在

java - 如何确定哪个接口(interface)属于每个网络目标 - Java?

java - 错误和线程

java - 是否有可用于 jvisualvm 或 NetBeans 分析器的调用 TreeView ?

java - "Not supported for this JVM"尝试连接到 VisualVM 上的远程主机时

Java VisualVM 内存采样器 - 如何获取特定类的大小

java - 如何解析 XML(RowsetSchema) 以在 JAVA 中使用 JAXB 解码

java - fileNotFoundException 但文件存在

java - 我在 Java Swing 中遇到了一些粉碎事件问题

java - ThreadpoolExecutor 和主线程并行执行