ByteBuf

ByteBuf

介绍Netty中的ByteBuf

byteBuf种类

netty中的byteBuf除了JDK中的heapBuffer和directBuffer还有compositeBuffer类型

传统的Java的nio操作都是ByteBuffer.allocate(int capacity)实际上是神了一个HeapBuffer。当通过Socket传输对象时候我们实际上是申请了一块临时的DirectBuffer(堆外内存),将数据copy到DirectBuffer,在write出去。所以HeapBuffer传输数据会有数据copy,DirectBuffer没有数据copy。但是申请和管理DirectBuffer会更复杂更慢。

Heap Buffer 堆缓冲区

ByteBuf将数据存储在JVM的堆空间,通过将数据存储在数组中实现的。
优点是:由于数据存储在JVM的堆中可以快速创建和快速释放,并且提供了数组的直接快速访问的方法。
缺点是:每次读写数据都要先将数据拷贝到直接缓冲区再进行传递。

Direct Buffer 直接缓冲区

在堆之外直接分配内存,直接缓冲区不会占用堆的容量。
优点是:在使用Socket传递数据时性能很好,由于数据直接在内存中,不存在从JVM拷贝数据到直接缓冲区的过程,性能好。
缺点是:因为Direct Buffer是直接在内存中,所以分配内存空间和释放内存比堆缓冲区更复杂和慢