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 不要自动从套接字缓冲区中读取。
我用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 不要自动从套接字缓冲区中读取。