对于netty零拷贝的理解

首先,零拷贝并不代表没有数据的拷贝,而是减少了拷贝的次数。正常情况下我们的socket缓冲区信息进入java虚拟机需要多次拷贝

socket缓冲区->内核态->用户态(内存)->java虚拟机堆内存


netty针对于字节缓冲区的数据拷贝进行了多方面的优化,主要体现在以下几个方面:

  1. 默认采用direct buffer
    netty的接收和发送ByteBuffer采用DIRECT BUFFER,使用堆外直接内存进行socket读写。如果使用传统的堆内存进行socket的读写,jvm会将堆内存Buffer拷贝一份到直接内存中,然后才写入socket中。

  2. 使用CompsiteByteBuffer
    它对外将多个ByteBuf封装成一个ByteBuf,对外提供统一封装后的ByteBuf接口。添加ByteBuf时,不需要做内存拷贝

  3. 文件传输
    利用操作系统的特性,直接从文件系统传输到channel中(即内存中)

你可能感兴趣的:(对于netty零拷贝的理解)