gpt4 book ai didi

java - 为什么从无限循环切换到 TimerTask 会导致 CPU 使用率下降?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:55 24 4
gpt4 key购买 nike

我写了一个守护进程,其结构如下:

while( true ) {
// do some stuff
Thread.sleep( 1000 );
}

我注意到它使用了大量的 CPU - 高达 100%。几个月来,我的生产服务器上有一个类似的守护进程,但出现了同样的 CPU 问题。

昨天我重构了代码以使用TimerTask .我立即注意到我的开发箱上的 CPU 使用率下降了。所以我决定部署到生产环境并使用 Munin 仔细检查。以下是图表:

Load average

CPU usage

几点:

  • 除了 JVM 之外,生产服务器上绝对没有运行任何其他东西。
  • 没有其他应用线程在运行
  • 它肯定是以正确的周期性间隔执行旧式代码 - 我总是在每次线程执行时写入日志。

那么:为什么 Thread.sleep 与 TimerTask 相比效率如此低?

最佳答案

我能想到的三种可能:

  • 您有大量 线程执行此操作,并且它们一直在进行上下文切换。使用计时器将意味着只有一个 线程。另一方面,这意味着您一次只能执行一个任务。
  • 在 sleep 之前,您在循环中的某处有一个continue; 语句,因此即使循环的主体工作不是很频繁地执行,某事是。不过,如果没有看到一些更具体的代码,很难说。
  • 您的 JVM/OS 组合出现问题。诚然,这似乎不太可能。

只是重复执行 Thread.sleep(1000) 的简单循环应该非常便宜 - 而且您也应该很容易验证。

关于java - 为什么从无限循环切换到 TimerTask 会导致 CPU 使用率下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com