ByteBuf Netty的数据容器
两个组件
- ByteBuf
- ByteBufHolder
使用模式
1.堆缓冲区 backing array模式
- 直接缓冲区
直接缓冲区的内容将驻留在常规的会被垃圾回收的堆之外。
- 复合缓冲区 CompositeByteBuf
为了举例说明,让我们考虑一下一个由两部分——头部和主体——组成的将通过 HTTP 协议
传输的消息。这两部分由应用程序的不同模块产生,将会在消息被发送的时候组装。该应用程序
可以选择为多个消息重用相同的消息主体。当这种情况发生时,对于每个消息都将会创建一个新
的头部。因为我们不想为每个消息都重新分配这两个缓冲区,所以使用 CompositeByteBuf 是一个
完美的选择。
JDK的方式实现
CompositeByteBuf
CompositeByteBuf 可能不支持访问其支撑数组,因此访问 CompositeByteBuf 中的数
据类似于(访问)直接缓冲区的模式
ByteBuf字节级操作
关键理解ByteBuf的结构,readIndex和writeIndex分离
- 随机访问索引
- 顺序访问索引
- 可丢弃字节
- 可读字节
- 可写字节
- 索引管理,mark标记
- 查找操作,查找某个字符在某个位置
- 派生缓冲区,生成一个原ByteBuf的视图
- 读写操作
ByteBufHolder 接口
除了实际的数据负载之外,我们还需要存储各种属性值。HTTP 响应便是一 个很好的例子,除了表示为字节的内容,还包括状态码、cookie 等。
ctrl+alt+b查看ByteBufHolder的实现
ByteBuf分配
- 按需分配:ByteBufAllocator接口
- Unpooled ByteBuf
- ByteBufUtil
- hexdump() 十六进制打印ByteBuf内容
ByteBuf的引用计数
一种通过在某个对象所持有的资源不再被其他对象引用时释放该对象所持有的资源来优化内存使用和性能的技术。
- ReferenceCounted 接口,和ChannelHandler以及ChannelPipeline相关