首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2011年的Java :线程套接字和NIO:在64位操作系统和最新的Java版本上可以选择什么?

2011年的Java :线程套接字和NIO:在64位操作系统和最新的Java版本上可以选择什么?
EN

Stack Overflow用户
提问于 2011-03-25 20:21:48
回答 5查看 3.8K关注 0票数 27

我在java.net和一些博客上读过几篇关于java.nio和StackOverflow的文章。但是,我仍然不知道什么时候应该更喜欢NIO而不是线程套接字。请你检查我下面的结论,告诉我哪些是不正确的,哪些是漏掉的?

  • ,因为在线程模型中,您需要为每个活动连接指定一个线程,每个线程为其堆栈占用大约250 on的内存,而每个套接字模型的线程将在大量并发连接上迅速耗尽内存。与现代操作系统和处理器中的NIO .
  • 不同,大量的活动线程和上下文切换时间对于

输出来说几乎是微不足道的,因为在高负载环境中异步NIO库使用的select()和轮询()比唤醒和休眠线程更昂贵。

  • NIO一直比较慢,但它允许您处理更多并发连接。它本质上是一种时间/空间权衡:传统IO速度更快,内存占用更重,NIO速度较慢,但使用较少的resources.
  • Java,根据JVM的不同,每个并发线程的硬限制为15000 / 30000,这将使每个连接模型的线程数限制到最大的并发连接数,但JVM7将没有这样的限制(无法确认此数据)。

因此,作为结论,您可以这样做:

如果您有数以万计的并发连接-- NIO是一个更好的选择,除非请求处理速度对您来说是一个关键因素--如果您的请求处理速度低于这个速度--那么每个连接都是一个更好的选择(考虑到您有足够的内存来容纳所有并发线程的堆栈,直到maximum)

  • With 7,那么在任何情况下,您都可能想使用NIO2.0。)。

我说的对吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-25 20:29:11

这在我看来是正确的,除了关于Java限制线程数量的部分--这通常受到运行在其上的操作系统的限制(请参阅How many threads can a Java VM support?Can't get past 2542 Threads in Java on 4GB iMac OSX 10.6.3 Snow Leopard (32bit))。

要到达这么多线程,您可能需要调整JVM的堆栈大小。

票数 3
EN

Stack Overflow用户

发布于 2012-01-19 21:18:27

我仍然认为传统IO中线程的上下文切换开销很大。在较高的级别上,只有当多线程不为相同的资源争用时,或者它们花费的时间比资源上的上下文切换开销高得多时,才能使用多线程获得性能。提出这个问题的原因是,使用新的存储技术(如SSD ),您的线程会更快地回到CPU上来竞争。

票数 2
EN

Stack Overflow用户

发布于 2012-04-10 01:47:53

没有一种构建NIO服务器的“最佳”方法,但是这个特定问题的优势表明人们认为存在!您的问题总结了适合这两个选项的用例,这些用例足以帮助您做出适合您的决定。

此外,混合解决方案也是可能的!当线程要做值得他们花费的事情时,您可以将通道交给线程,当它更好的时候,您可以坚持使用NIO。

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

https://stackoverflow.com/questions/5437722

复制
相关文章

相似问题

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