知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
一、零拷贝是什么
零拷贝指在I/O操作过程中
a. 不消耗CPU资源来控制数据拷贝
b. 直接在内核空间完成数据操作
二、实现零拷贝
1.从系统层面实现
linux中使用 sendfie
2. JDK层面实现
Java NIO中使用FileChannel.transferTo
3. Netty 实现
Netty中对NIO FileChannel.transferTo 包装成 FileRegion
三、netty实现零拷贝
3.1 Socket 读写零拷贝实现
使用直接内存ByteBuffer进行收发操作,避免使用JVM的堆内存进行socket收发。也就避免了一次堆内存和直接内存的拷贝动作。
3.2 File 文件读写零拷贝实现
使用Netty提供的FileRegion类中的 transferTo 方法,直接把文件缓冲区数据发生到目标Channel
3.3 直接内存 ByteBuf 合并操作零拷贝实现
使用Netty提供的CompositeByteBuf类,来合并多个ByteBuf,只是把多个ByteBuf进行逻辑上的合并,实际上没有进行内存拷贝。
使用场景: 网络传输 报文头 和 主体 合并,进行传输动作。
3.4 直接内存 ByteBuf 拆分操作零拷贝实现
使用Netty提供的ByteBuf支持slice操作,从逻辑上拆分成多个ByteBuf独立的存在,实际用的还是原来的共享区。
使用场景: 网络传输 读取报文中的 报文头和主体进行拆分。
领取专属 10元无门槛券
私享最新 技术干货