BLOCKED线程是否会导致高CPU消耗

时间:2017-03-08 16:36:28

标签: jvm cpu-usage thread-dump apm

我们最近在生产环境中看到了高CPU消耗问题,并且在调试时发现了一些奇怪的问题。当我做一个“top -H”来查看每个线程ID的CPU统计信息时,我发现一个线程X消耗高CPU。当我接受线程转储时,我看到这个线程X处于BLOCKED状态。这是什么意思,处于BLOCKED状态的线程能否消耗高CPU?我认为这可能是一个微不足道的问题,但我是调试性能问题和JVM的新手,不知道我在这里可能会缺少什么。

2 个答案:

答案 0 :(得分:2)

进入和退出BLOCKED状态可能很昂贵。如果你被阻塞了一会儿,这不是问题,但如果你在繁忙的循环中短暂阻塞,你的线程可能会被阻塞,但实际上是在烧CPU。

我会寻找多个线程反复竞争共享资源,这些资源非常简短地进入BLOCKED。

答案 1 :(得分:1)

@Peter已经提到了关于繁忙循环的好处(在同步的情况下可能是自旋锁的JVM内部adaptive optimization或者在某些条件下由应用程序本身创建的繁忙循环)可以烧掉CPU。还有另一种间接方式,由于线程阻塞,CPU可能会非常高。通常在Web服务器中,如果许多线程处于阻塞状态(不是因为同步锁相关阻塞而是等待来自后端数据存储的IO),那么它可能会给JVM垃圾收集带来很大压力。这些工作线程应该快速完成它们的工作,以便它们在堆上创建的所有对象都可以快速取消引用并进行垃圾回收。如果有很多线程处于这种状态,那么垃圾收集线程必须超时工作,最终可能会占用大量CPU。