提供的三种缓冲区类型
1 heap buffer(堆缓冲区)
在JVM堆上分配的缓冲区,底层通过byte array来存放实际数据;
日常开发用的最多。
优点:由于数据是存储在JVM的堆中,因此可以快速的创建与快速的释放,并且它提供了直接访问内部字节数组的方法。
缺点:每次读写数据时,都需要先将数据复制到直接缓冲区中再进行网络传输。
2 direct buffer(直接缓冲区)
在堆外直接分配内存空间,直接缓冲区不会占用堆的容量空间,因为它是由操作系统在本地内存进行的数据分配。
优点:在使用socket进行数据传递时,性能非常好,因为数据直接位于操作系统的本地内存中不需要从JVM将数据复制到直接缓冲区中,性能很好。
缺点:因为Dierct buffer是直接在操作系统的内存中的,所以内存空间的分配和释放要比堆空间更加复杂,而且速度更慢一些。
Netty通过提供内存池来解决这个问题。直接缓冲区并不支持通过字节数组的方式来访问数据。
重点:对于后端的业务消息的编解码来说,推荐使用HeapByteBuf;对于I/O通信线程在读写缓冲区时推荐使用DirectByteBuf。
3 composite buffer(复合缓冲区)
复合缓冲区。容器类型
相当于容器,里面可以存heap buffer和direct buffer。
下面为composite buffer的例子
import java.util.Iterator;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
public class ByteBufTest2 {
public static void main(String[] args) {
CompositeByteBuf buf = Unpooled.compositeBuffer();
ByteBuf heapBuf = Unpooled.buffer(10);
ByteBuf directBuf = Unpooled.directBuffer(10);
buf.addComponents(heapBuf,directBuf);
buf.removeComponent(0);
Iterator<ByteBuf> iter = buf.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
buf.forEach(System.out::println);
}
}