netty、内核space或用户space分配的direct buffer内存在哪里?

Where is the memory of direct buffer allocated by netty, kernel space or user space?

我用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,网站的字节在哪里ByteBuf.read,它们在内核中space,还是在用户 space 中?它是否比我使用 HeapBuffer 少了一个内存副本(因为它不会复制给用户 space)?

在用户 space 中分配了一个 DirectBuffer,但在 JVM 堆之外。请注意,在谈论套接字 I/O 时,此 仍然 涉及从内核缓冲区到用户 space 缓冲区的副本。但是,它确实消除了 JVM 需要用来复制 to/from 堆的 intermediate user-space 缓冲区的需要。因此,I/O 操作可以直接在本机 user-space 缓冲区上发生,就好像您是 运行 C 代码一样。

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