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

我何时应该将直接缓冲区与Java NIO一起用于网络I / O的简单规则?

席安康
2023-03-14
问题内容

有天赋的人能以简单明了的方式解释复杂的事情吗?为了在使用Java NIO进行网络I /
O时应该使用直接ByteBuffer而不是常规ByteBuffer来获得最佳性能?

例如:我应该读入堆缓冲区并从那里解析它,做很多get()(逐字节),还是应该读入直接缓冲区并从直接缓冲区进行解析?


问题答案:

为了在使用Java NIO进行网络I / O时应该使用直接ByteBuffer而不是常规ByteBuffer来获得最佳性能?

直接缓冲区具有许多优点

  • 避免在Java和本机内存之间传递数据的额外副本。
  • 如果重新使用它们,则只有所使用的页面会变成真实的内存。这意味着您可以使它们超出我所需的大小,并且它们只会浪费虚拟内存。
  • 您可以有效地以本地字节顺序访问多字节基元。(基本一条机器码指令)

我应该读入堆缓冲区并从那里进行解析,执行许多get()(逐字节),还是应该将其读入直接缓冲区并从直接缓冲区进行解析?

如果您一次读取一个字节,则可能不会获得太多优势。但是,使用直接字节缓冲区,您一次可以读取2或4个字节,并且可以一次有效地html" target="_blank">解析多个字节。

[实时] [选择器]

如果您要解析实时数据,则应避免使用选择器。我发现使用阻塞NIO或忙于等待NIO可以为您提供最低的延迟性能(假设您的连接数量相对较少,例如最多20个)



 类似资料:
  • 问题内容: 在编写用于OpenGL库的Matrix类时,我遇到了一个问题,即使用Java数组还是使用Buffer策略存储数据(JOGL为Matrix操作提供直接缓冲区复制)。为了对此进行分析,我编写了一个小型性能测试程序,该程序比较了Arrays vs Buffers和Direct Buffers上循环和批量操作的相对速度。 我想在这里与您分享我的结果(因为我发现它们很有趣)。请随时发表评论和/或

  • 我是通过阅读Spring Boot in Action这本书开始学习Spring Boot的,我正在学习这本书中的示例,试图自己运行它们,但我在使用时遇到了问题。 我已经翻遍了这一章,寻找我可能的不匹配。然而,它就是不起作用。 这个项目应该是一个简单的阅读清单。 代码如下: 读者@实体: Jpa接口:

  • 我有一个正常工作的普通Hapi应用程序,我计划迁移到Swagger。我使用官方说明安装了swagger-node,并在执行“swagger项目创建”时选择了Hapi。但是,我现在很困惑,因为似乎有几个库用于集成swagger-node和hapi: < li>hapi-swagger:最受欢迎的一款 < Li > hapi-waggered:有点流行 < li>swagger-hapi:不受欢迎且不

  • 问题内容: 由于它不在jvm heap&gc中,何时发布?还是一直保留到流程终止? 但是所有答案都是模糊的,没有一个明确的答案,是否有明确的答案?至少适用于 64位Linux 上的 Java 8 。 __ 问题答案: 不使用旧的Java终结器。相反,它使用内部API。它创建一个新线程并存储到每个创建的线程中(除了重复和切片指的是主缓冲区)。当变成 幻影可到达的 (也就是说,不再存在对字节缓冲区的强

  • 问题内容: 我正在寻找在Linux上执行异步文件I / O的最有效方法。 POSIX glibc实现使用用户空间中的线程。 本地aio内核api仅适用于无缓冲操作,存在用于内核以添加对缓冲操作的支持的补丁程序,但是这些补丁程序已有3年的历史了,似乎没有人关心将它们集成到主线中。 我发现了许多其他允许异步I / O的想法,概念和补丁,尽管其中大多数都在3年以上的文章中。在当今的内核中,这到底是什么呢

  • 问题内容: 在Java 1.4+中,有3种方法来中断在套接字I / O上阻塞的流: 如果套接字是使用常规构造函数创建的,则可以从单独的线程中关闭它。结果,在被阻塞的线程中抛出了a 。 如果套接字是使用创建的。(非阻塞I / O)—同样,可以从单独的线程关闭它,但是现在在阻塞的线程中引发了一个不同的异常()。 另外,在使用非阻塞I / O的情况下,有可能引发抛出中断的阻塞线程。使用旧式Java I