休眠和等待线程消耗了多少资源?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (61)

在java 1.6 x64中拥有多个处于等待状态的线程是多么昂贵。

在编写应用程序,它运行在许多计算机上,并从一个计算机到另一个计算机发送/接收数据。对于每台已连接的机器和任务,1)发送数据,2)接收数据,3)删除连接时重新建立连接。因此,假设集群中有N个节点,那么每台机器都将有3个线程,用于每个N-1邻居。通常会有12台机器,有33个通信线程。

这些线程大部分时间都处于休眠状态,因此为了优化目的,我可以减少线程的数量,并为每个线程提供更多的工作。

那么,是否有任何重大的性能影响有许多睡眠线程?

提问于
用户回答回答于

在大多数情况下,休眠线程消耗的资源将是其堆栈空间。使用每个连接的2线程模型,我认为这与所描述的相似,因为当连接数量增加时,就会导致很大的可伸缩性问题。

我自己也遇到过这种情况,当连接的数量超过500个连接(大约有1000个线程)时,往往会遇到很多情况,会得到OutOfMemoryError,因为线程堆栈空间的使用超过了单个进程的最大内存量。至少在我们的例子中,这是在32位Windows世界上的Java中。

如果需要大量的连接,JavaNIO(新IO或其他什么的)就是要走的路,这样就可以在同一个线程中处理大量的连接。

用户回答回答于

在我们切换到NIO之前,我们也遇到了同样的问题,所以我将根据Liedman的建议采用该框架。

SwithcingtoNIO增加了我们可以处理的连接数量。

扫码关注云+社区