在“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/