代码之家  ›  专栏  ›  技术社区  ›  Alexis

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

  •  1
  • Alexis  · 技术社区  · 6 年前

    我使用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,那么网站的字节在哪里。阅读,它们是在内核空间还是在用户空间?它是否比我使用的HeapBuffer少了一个内存拷贝(因为它不会复制到用户空间)?

    1 回复  |  直到 6 年前
        1
  •  3
  •   spinlok    6 年前

    DirectBuffer分配在用户空间中,但在JVM堆之外。请注意,当谈到套接字输入/输出时,这 涉及从内核缓冲区到用户空间缓冲区的复制。然而,它确实消除了 中间的 JVM需要使用的用户空间缓冲区来向堆中复制或从堆中复制。因此,I/O操作可以直接在本机用户空间缓冲区上进行,就像您在运行C代码一样。

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