我使用netty 4编写一个简单的http客户端。据我所知,如果我使用HeapBuffer,当我在ChannelInboundHandler中获取ByteBuffer时
@Override
public void channelRead(ChannelHandlerContext ctx, final ByteBuf msg) throws Exception {
// do nothing with the msg
}
网站上的字节应该是一个过程(即使我不调用ByteBuf.read)
socket -> kernel space -> user space
字节应该在java堆中,对吗?
我想知道我是否使用DirectBuffer,当“channelRead”被触发时,如果我不调用ByteBuf.read,它们在内核空间或用户空间中的哪些字节形成网站?它比我使用HeapBuffer少一个内存副本(因为它不会复制到用户空间)?
答案 0 :(得分:2)
DirectBuffer在用户空间中分配,但在JVM堆外部。请注意,在讨论套接字I / O时,此仍然涉及从内核缓冲区到用户空间缓冲区的副本。但是,它确实消除了对JVM需要用于复制到堆中/从堆中复制的中间用户空间缓冲区的需要。因此,I / O操作可以直接在本机用户空间缓冲区上进行,就像您运行C代码一样。
Re:您的netty代码段,当netty调用channelRead
时,数据已经被读入ByteBuf
(在用户空间中)。如果您希望数据保留在套接字缓冲区中(例如,实现背压),可以调用channel.config.setAutoRead(false)告诉netty不要自动从套接字缓冲区中读取数据。