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

Vla*_*sny 26 java io networking nio

我在StackOverflow和一些博客上阅读了几篇关于java.net vs java.nio的帖子.但我仍然无法理解何时应该更喜欢NIO而不是螺纹插座.你能否在下面检查我的结论并告诉我哪些不正确以及哪些错过了?

  • 因为在线程模型中,您需要为每个活动连接专用一个线程,并且每个线程为其堆栈提供250Kilobytes的内存,使用每个套接字模型,您将在大量并发连接上快速耗尽内存.与NIO不同.

  • 在现代操作系统和处理器中,可以认为大量活动线程和上下文切换时间对于性能几乎无关紧要

  • NIO的整个吞吐量可以更低,因为异步NIO库在高负载环境中使用的select()和poll()比唤醒和放入休眠线程更昂贵.

  • NIO一直比较慢,但它允许您处理更多的并发连接.它本质上是一个时间/空间权衡:传统IO速度更快但内存占用更大,NIO速度更慢但使用的资源更少.

  • Java每个并发线程的硬件限制为15000/30000,具体取决于JVM,这会将每个连接模型的线程限制为此并发连接数最大,但JVM7将没有此限制(无法确认此数据).

所以,作为结论,你可以这样:

  • 如果您有数万个并发连接 - 除非请求处理速度是您的关键因素,否则NIO是更好的选择
  • 如果你的数量少于 - 每个连接的线程是一个更好的选择(假设你能够承受大量的RAM来保持所有并发线程的堆栈达到最大值)
  • 使用Java 7,您可能希望在任何一种情况下都使用NIO 2.0.

我对么?

Ada*_*zak 3

这对我来说似乎是正确的,除了关于 Java 限制线程数 \xe2\x80\x93 的部分,该部分通常受其运行的操作系统的限制(请参阅Java VM 可以支持多少个线程?Can'在 4GB iMac OSX 10.6.3 Snow Leopard(32 位)上,Java 无法超过 2542 个线程

\n\n

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

\n

  • @FractalizeR:这是正确的。在当前的 TCP 实现中,每个传出连接都需要唯一的端口号。理论上,TCP/IP 堆栈在分配传出端口时可以注意到元组;实际上,由于 API,这是不可能的:具体来说,bind() 在 connect() 之前发生,无论是显式还是隐式。 (2认同)
  • @DobesVandermeer API *不是*“有它”,因为我给出的原因。 (2认同)