首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >休眠和等待线程消耗了多少资源?

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

Stack Overflow用户
提问于 2008-09-19 09:24:30
回答 5查看 6.4K关注 0票数 19

我想知道,在java1.6 x64中,让许多线程处于等待状态是多么的昂贵。

更具体地说,我正在编写跨多台计算机运行的应用程序,并从一台计算机向另一台计算机发送/接收数据。我觉得每个连接的机器和任务都有单独的线程更舒服,比如1)发送数据,2)接收数据,3)当连接被丢弃时重新建立连接。因此,假设集群中有N个节点,对于N-1个邻居,每台机器将有3个线程。通常有12台机器,即33个通信线程。

这些线程中的大多数将在大部分时间处于休眠状态,因此为了优化目的,我可以减少线程的数量并为每个线程分配更多的工作。打个比方。重新建立连接是接收线程的责任。或者发送到所有连接的机器都是由单线程完成的。

那么,拥有许多休眠线程是否会对性能产生重大影响呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-09-19 09:34:10

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

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

如果需要大量连接,可以使用Java NIO (新IO或其他任何东西),这样就可以在同一线程中处理大量连接。

话虽如此,在一个相当现代的服务器上,100个以下的线程应该不会遇到太多问题,即使这可能仍然是对资源的浪费。

票数 15
EN

Stack Overflow用户

发布于 2008-09-19 10:56:33

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

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

票数 2
EN

Stack Overflow用户

发布于 2008-09-19 09:40:26

这不会有很好的可扩展性。拥有大量线程意味着虚拟机必须花费更多时间进行上下文切换,并且由于每个线程都需要自己的堆栈空间,因此内存使用率将会更高。使用较少的线程以流水线方式处理会更好,或者使用异步技术的线程池。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/100707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档