【Java】Java中的零拷贝( 四 )

MappedByteBuffer来处理文件映射,使用MappedByteBuffer向网络中发送数据的过程如下:

  1. 使用MappedByteBuffer建立文件映射,用户空间可以通过虚拟地址直接访问映射的文件数据;
  2. 将映射的文件数据拷贝到socket网络缓冲区(CPU复制);
  3. DMA将socket缓冲区的数据拷贝到网卡(DMA复制);

【Java】Java中的零拷贝

文章插图
MappedByteBuffer减少了从内核缓冲区到用户缓冲区的数据拷贝,可以直接将内核缓冲区的数据拷贝到网络缓冲区 。
FileChannelJava NIO中的FileChannel可以实现将数据从FileChannel直接传输到另一个Channel,它是sendfile的一种实现:
RandomAccessFile file = new RandomAccessFile(new File("/Users/sml/test.txt"), "r");// 获取FileChannelFileChannel fileChannel = file.getChannel();long size = fileChannel.size();SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080));fileChannel.transferTo(0,size,socketChannel);参考
【极客时间-倪朋飞】Linux性能优化实战
【极客时间-刘超】趣谈Linux操作系统
【拉勾教育-若地】Netty 核心原理剖析与 RPC 实践
【 Kirito的技术分享】文件IO操作的最佳实践
【小码农叔叔】java使用nio读写文件
【占小狼】深入浅出MappedByteBuffer
【零壹技术栈】深入剖析Linux IO原理和几种零拷贝机制的实现
【tomas家的小拨浪鼓】堆外内存 之 DirectByteBuffer 详解
网络IO和磁盘IO详解

经验总结扩展阅读