Netty自己封装了一个缓存区对象ByteBuf,那么就看看ByteBuf与Nio的buffer相比有什么优点呢。

ByteBuf

ByteBuf使用模式

heap buffer(堆缓冲区)

  • 数据存储在 JVM 的堆空间
  • GC 可以及时释放内存空间

direct buffer(直接缓冲区)

  • 没有中间内存交换的二次拷贝,也就是通常说的“零”拷贝。
  • 驻留在垃圾回收扫描的堆区以外,需要手工管理内存(分配和释放等)。
  • 在 -XX:MaxDirectMemorySize=xxM大小限制下, 使用 Heap 之外的内存, GC对此”无能为力”,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响。

composite buffer(复合缓冲区)

  • 可以创建多个不同的 ByteBuf,然后提供一个这些 ByteBuf 组合的视图。
  • 复合缓冲区就像一个列表,我们可以动态的添加和删除其中的 ByteBuf,JDK 的 ByteBuffer 没有这样的功能。

ByteBuf的结构

byteBuf维护了两个不同的索引:一个是用于读取,一个用于写入。当你从ByteBuf读取是,它的readerIndex将会被递增已经被读取的字节数。同样地,当你写入ByteBuf时,它的witerIndex也会被递增。

定义在AbstractByteBuf中

1
2
int readerIndex;
int writerIndex;

ByteBuf的分类

主要可以分为以下的类别:

  • 池化的/非池化的
  • Direct/Heap
  • Safe/UnSafe

这些类别可以相互组合形成一个ByteBuf类

参考

Netty buffer缓冲区ByteBuf
【Netty】ByteBuf (一)