ByteBuf与ByteBuffer

我们在Netty 源码分析之Java NIO已经详细了解了NIO Buffer。这里先回忆下NIO Buffer的一些特性:

  • ByteBuffer底层实现包含四个关键字段,并满足大小关系:mark <= position <= limit <= capacity;

  • ByteBuffer存在写模式和读模式两种状态,内部方法可以触发状态切换,比如flip方法从写状态切换为读状态;

  • 不同类型的ByteBuffer支持不同的数据类型,包括ByteBuffer、ShortBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer等类型。

Netty的ByteBuf的底层实现有些许类似,但相比ByteBuffer实现了非常多扩展,并摒弃了一些不足:

  • 不区分读写状态,不需要切换状态;

  • 支持池化,避免频繁的GC回收;

  • 支持引用计数;

  • 类型兼容(同一个ByteBuf可以承载各种数据类型);

  • 支持Unsafe操作的ByteBuf;

  • 支持堆外和堆内两种ByteBuf;

  • 支持零拷贝的复合类型CompositeByteBuf;

  • ...

ByteBuf继承关系

我们先来看看ByteBuf的类图: