java - 从套接字到套接字的零分配复制

标签 java performance sockets nio low-latency

假设我们有一个套接字连接(我们称之为c1),我们可以在其中接受消息, 我们还有 N 个其他套接字连接,我们将写入完全相同的消息, 为了确定我们希望它写入哪个连接,我们只需要从c1读取前几个字节,但是套接字上的其余字节不需要加载到java堆中,只需要将写入c2...

简而言之,我们想做的是。 我们收到了在 c1 上有字节要读取的事件 我们读取前几个字节并确定我们想要将其重定向到c2。 我们将从 c1 中获取的前几个字节写入 c2,现在我们要告诉系统从 c1 写入接下来的 N 个字节> 直接到 c2 (而不是 c1 -> java 堆 -> c2)。

有什么方法可以在java中做到这一点吗?


更新:

虽然答案很切题,但如果您正在构建类似的东西(甚至不仅用于多路复用,还用于一些小的业务逻辑),我强烈建议您使用 ZeroMQ。

最佳答案

Say we are doing C++ is there a way to tell the OS to pass data from buffer to buffer without loading into application memory?

So basically the question is does Linux allow to pass N bytes from socket buffer A to socket buffer B (we can safely assume that we are on linux, and that no one else is reading or writing to A and B)

可以使用 Linux“sendfile”系统调用来完成此操作。

引用:

但是,Java I/O 类库不支持这一点。

更新 - 显然是支持的;请参阅 FileChannel::transferTo 方法。查看FileChannel zero-copy transferTo fails to copy bytes to SocketChannel的答案例如,它显示了与套接字一起使用的情况。但是,尚不清楚它是否可以用于套接字到套接字的复制。

更新 2 - 基于 Using Java to perform Zero Copy data transfers between two or more sockets 的答案,我想答案可能是:“不,不能”。然而。

更新 3 - 这是 RFE - https://bugs.openjdk.java.net/browse/JDK-6653061

关于java - 从套接字到套接字的零分配复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725564/

相关文章:

java - 最有效地使用 substring()

sockets - 动态创建对等套接字(ZeroMQ)

TCP 套接字上的 send() 可以返回 >=0 和 <length 吗?

performance - 从表存储读取期间 CPU 使用率高

performance - 汇入资料时缓慢的汇总查询

java - 将 JPanel 替换为具有更新内容的相同内容

java - 复制/重复的引用变量有什么意义?

java - 作为服务与大型 java 程序交互?

java - 使用相同的附加程序记录多个记录器

java - 如何解释Java中的多重继承