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

2022-09-02 13:36:55

我想知道,在java 1.6 x64中有许多线程处于等待状态是多么昂贵。

更具体地说,我正在编写应用程序,该应用程序可以在许多计算机上运行,并从一台计算机发送/接收数据到另一台计算机。我觉得为每个连接的机器和任务使用单独的线程更舒服,例如1)发送数据,2)接收数据,3)在断开连接时重新建立连接。因此,假设群集中有 N 个节点,则每台计算机将有 N-1 个邻居中的每一个 3 个线程。通常将有 12 台计算机,即 33 个通信线程。

这些线程中的大多数大部分时间都处于休眠状态,因此出于优化目的,我可以减少线程数并为每个线程提供更多作业。例如,例如。重新建立连接是接收线程的责任。或者发送到所有连接的计算机是通过单个线程完成的。

那么,拥有许多休眠线程是否有任何显着的性能影响?


答案 1

在大多数情况下,休眠线程消耗的资源将是其堆栈空间。使用每个连接 2 线程的模型(我认为这与您所描述的类似),众所周知,当连接数变大时,由于这个原因,会导致巨大的可伸缩性问题。

我自己也遇到过这种情况,当连接数增长到500个连接(大约一千个线程)时,你往往会遇到很多情况,你会得到OutOfMemoryError,因为线程堆栈空间使用量超过了单个进程的最大内存量。至少在我们的例子中,这是在32位Windows世界的Java中。我想,你可以调整一些东西并走得更远,但最终它只是不是很可扩展,因为你浪费了大量的内存。

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

话虽如此,在合理的现代服务器上,少于100个线程不应该遇到太大问题,即使它可能仍然是浪费资源。


答案 2

在切换到NIO之前,我们遇到了非常相同的问题,所以我将支持Liedmans的建议,以使用该框架。你应该能够找到一个教程,但是如果你想要细节,我可以推荐Ron Hitchens的Java NIO

切换到NIO增加了我们可以处理的连接数量,这对我们来说真的很关键。