Netty buffer缓冲区ByteBuf
byte 作为网络传输的基本单位,因此数据在网络中进行传输时需要将数据转换成byte进行传输。netty提供了专门的缓冲区byte生成api ByteBuf。
Buffer API主要包括:
- ByteBuf
- ByteBufHolder
Netty 缓冲 API 提供了几个优势:
- 可以自定义缓冲类型
- 通过一个内置的复合缓冲类型实现零拷贝
- 扩展性好,比如 StringBuilder
- 不需要调用 flip() 来切换读/写模式
- 读取和写入索引分开
- 方法链
- 引用计数
- Pooling(池)
ByteBuf索引
- 读索引
- 写索引
ByteBuf使用模式
heap buffer(堆缓冲区)
- 数据存储在 JVM 的堆空间
- GC 可以及时释放内存空间
direct buffer(直接缓冲区)
- 没有中间内存交换的二次拷贝,也就是通常说的“零”拷贝。
- 驻留在垃圾回收扫描的堆区以外,需要手工管理内存(分配和释放等)。
- 在 -XX:MaxDirectMemorySize=xxM大小限制下, 使用 Heap 之外的内存, GC对此”无能为力”,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响。
composite buffer(复合缓冲区)
- 可以创建多个不同的 ByteBuf,然后提供一个这些 ByteBuf 组合的视图。
- 复合缓冲区就像一个列表,我们可以动态的添加和删除其中的 ByteBuf,JDK 的 ByteBuffer 没有这样的功能。