当前位置: 首页 > 面试题库 >

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

程招
2023-03-14
问题内容

我已经在StackOverflow和一些博客上阅读了有关java.net vs
java.nio的几篇文章。但是我仍然无法理解何时应该使用NIO而不是螺纹插座。您能否检查以下我的结论,并告诉我哪些是不正确的,哪些是未得到的?

  • 由于在线程模型中,您需要为每个活动的连接专用一个线程,并且每个线程的堆栈占用大约250 KB的内存,因此对于每个套接字模型,每个线程都会在大量并发连接上很快耗尽内存。不像蔚来

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

  • NIO通过输出可能会更低,因为异步NIO库在高负载环境中使用的select()和poll()比唤醒线程并使其进入睡眠状态要昂贵得多。

  • NIO一直较慢,但是它允许您处理更多的并发连接。从本质上讲,这是时间/空间上的折衷:传统IO速度更快,但内存占用量更大,NIO速度较慢,但​​占用的资源更少。

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

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

  • 如果您有成千上万的并发连接-除非请求处理速度是您的关键因素,否则NIO是一个更好的选择
  • 如果您的内存少于该数量,则每个连接线程是一个更好的选择(假设您有足够的RAM容量来容纳所有并发线程的堆栈,最大数量)
  • 使用Java 7,无论哪种情况,您都可能希望使用NIO 2.0。

我对么?


问题答案:

这对我来说似乎是正确的,除了有关Java限制线程数的部分(通常受其运行的操作系统限制)(请参阅JavaVM可以支持多少个线程?并且不能超过2542个Java中的线程)。 4GB iMac OSX 10.6.3 SnowLeopard(32位))。

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



 类似资料:
  • 问题内容: 使用Java本机接口时,我遇到了一个导致此错误的问题。我相信这是因为我使用MinGW编译了.dll,而我的系统是64位的,因此我的Java运行于64位,而MinGW编译为32位的.dll。无论如何,有没有强制我的Java在32位上运行? 问题答案: 您将必须安装32位JVM,然后才能运行代码。 如果要分发应用程序,则将要构建DLL的32位和64位版本。然后,使用以下技术来加载正确的DL

  • 问题内容: 有谁知道我会怎么做才能检测到Windows在Python下的版本。我需要知道这是为Program Files使用正确的文件夹的一种方式。 非常感谢 问题答案: 模块 -访问基础平台的标识数据 在64位Windows上,32位Python返回: 这意味着 即使已接受此答案,也不正确。 请参阅以下一些答案,以了解可能适用于不同情况的选项。

  • 问题内容: 在C语言中,在64位系统上long为64位。这反映在Python的ctypes模块中吗? 问题答案: 的大小 取决于内存模型。在Windows(LLP64)上是32位,在UNIX(LP64)上是64位。 如果需要64位整数,请使用。 如果需要指针大小的整数,请使用(“该值表示为整数”)。

  • 导入tensorflow时,会出现以下错误: 回溯(最后一次调用):文件“C:\Users\User\Anaconda3\lib\site packages\tensorflow\python\pywrap\u tensorflow.py”,第58行,来自tensorflow.python.pywrap\u tensorflow\u internal import*文件“C:\Users\User

  • 问题内容: Oracle的可用下载列表上似乎没有32位下载程序包。 更新 可以在这里下载: 问题答案: 尽管Oracle的糟糕,未加密的 下载页面 似乎缺少JDK9的32位二进制文​​件,但是,如果(单击“接受许可协议”后)复制64位二进制文​​件的URL并更改 为 ,它将为您提供32 位二进制文​​件位二进制文​​件。 更新:现在不见了。怪异的!Oracle在玩什么?他们致力于修复Java 9的