netty,内核空间或用户空间分配的直接缓冲区的内存在哪里?

时间:2018-03-08 14:03:12

标签: java netty nio

我使用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少一个内存副本(因为它不会复制到用户空间)?

1 个答案:

答案 0 :(得分:2)

DirectBuffer在用户空间中分配,但在JVM堆外部。请注意,在讨论套接字I / O时,此仍然涉及从内核缓冲区到用户空间缓冲区的副本。但是,它确实消除了对JVM需要用于复制到堆中/从堆中复制的中间用户空间缓冲区的需要。因此,I / O操作可以直接在本机用户空间缓冲区上进行,就像您运行C代码一样。

Re:您的netty代码段,当netty调用channelRead时,数据已经被读入ByteBuf(在用户空间中)。如果您希望数据保留在套接字缓冲区中(例如,实现背压),可以调用channel.config.setAutoRead(false)告诉netty不要自动从套接字缓冲区中读取数据。