太多未使用的阻塞线程的后果

时间:2015-06-03 22:31:56

标签: java multithreading performance threadpool

我想在未使用的线程效果上清除我的概念。线程池中太多未使用的阻塞线程的总体影响是什么。 假设我有一个包含100个线程的线程池,其中50个未使用并等待请求处理,但请求的到达率为2,因为50个线程处于阻塞状态。

将影响哪些系统资源?

CPU资源会受影响吗?

内存资源会受影响吗?

此方案对线程管理开销有何影响?即线程管理开销只涉及50个正在运行的线程或100个线程的全部?

2 个答案:

答案 0 :(得分:1)

  

将影响哪些系统资源?

内存。每个本机线程都需要一些用于其堆栈。它并不多,我不会关心50个主题。

由于其他原因而被阻止的线程"等待工作"可能是一个更大的问题,因为它可能包含其他资源,包括例如文件描述符,这些资源是有限的。

如果服务器运行许多等待外部资源(文件或数据库访问)的请求,这可能是个问题。

此外,有ThreadLocal个,可能包含以后可能需要或可能不需要的数据。它甚至可能导致内存泄漏,如here,但这与<空闲)线程的数量完全无关

  

CPU资源会受影响吗?

他们为什么要这样?在Java中,它只是一个坐在空闲线程集合中的对象。

  

内存资源会受影响吗?

见上文。

答案 1 :(得分:-1)

查看有关CPU Scheduling的文章。

正在等待某些中断的线程(由OS或java notify完成)只是位于集合中,并且不参与资源管理。只有处于就绪状态的线程才能获得CPU资源。

受影响的资源可能只能通过锁定,以防线程处于休眠状态(这意味着锁定未被释放)。

不要在物理上可用的线程之上创建太多线程。即使切换TCBPCB更快,也尽量避免使用{{3}}。具体需求取决于使用JIT,硬件和您自己的实现。