我了解到,对于I / O,Direct Byte Buffer在本机堆上分配内存,而ByteBuffer在java堆上分配内存,因此我们需要将数据从java堆复制到本机堆以进行I / O操作。
所以我的问题是,
直接bytebuffer的本地堆是JVM的地址空间的一部分吗?
如果不是为什么操作系统需要本机堆来从套接字读取数据? 为什么它不能直接从scoket读取数据到JVM的地址空间?或请求流程的地址空间。
我的目标:我是电子工程师。最近开始研究java,以获得需要最小延迟的项目。我有各种选项,多线程,jvm调整。这些问题来自我的分析,我会考虑这些选择。
答案 0 :(得分:0)
直接bytebuffer的本地堆是JVM地址空间的一部分吗?
是的,是的。
它位于地址范围之外,用于java对象并由GC管理。
因为我们需要将数据从java堆复制到本机堆以进行I / O操作。
如果您正在对二进制数据进行操作,您可以将其保存在DBB中,并使用访问器方法迭代其字节。这样,只会临时复制您访问的字节。非直接BB的优点是您可以直接访问其后备byte[]
数组。但是如果你不需要那么在某些情况下DBB可以更快。
可能的情况:
使用BB - >复制到原生
使用DBB - >无需副本
使用java对象 - >序列化为BB - >复制到原生
使用java对象 - >序列化为DBB - >无需额外复印件
在这些情况下,您会注意到使用DBB会减少复制。
这是一个没有的地方:
使用BB - >将基础数组传递给期望byte[]
的方法
使用DBB - >复制到byte [] - >传递给方法
在这些情况下,需要重写该方法以接受字节缓冲区。
最近开始为一个需要最小延迟的项目开发java。我有各种选项,多线程,jvm调整。这些问题来自我的分析,我会考虑这些选择。
你真的不应该担心这种低级细节。优化前测量。当你以后需要时,从BB切换到DBB是微不足道的。