什么是零拷贝
零拷贝(Zero-Copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于网络传输文件时节省CPU周期和内存带宽。
- 零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。
- 零拷贝技术减少了用户进程空间和内核空间之间因为上下文切换带来的开销。
注意:没有说不需要拷贝,只是减少冗余(不必要)的拷贝。
Java支持哪些零拷贝
NIO提供的内存映射MappedByteBuffer
首先要说明的是,JavaNIO中的Channel就相当于操作系统中的内核缓冲区,有可能是读缓冲区,也有可能是网络缓冲区,而Buffer就相当于操作系统中的用户缓冲区。
NIO提供的sendfile
- FileChannel.transferTo()方法直接将通道内容传输到另一个通道,没有涉及Buffer的任何操作,NIO的Buffer是JVM堆或堆外内存,但不论如何他们都是操作系统内核空间内存。
- transferTo()的实现方式就是通过系统调用sendfile()
Kafka中的零拷贝
Kafka两个重要过程都使用了零拷贝技术,且都是操作系统层面的狭义零拷贝,一是Producer生产者存到broker,二是Consumer从broker读取数据。
- Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入。
- Consumer从broker读取数据,采用sendfile,将磁盘文件读取OS内核缓冲区后,直接转到socket buffer进行网络发送。