Netty--ByteBuf
目录
NIO ByteBuffer局限性
ByteBuf功能
基本功能
读写功能
扩容与收缩
查找
Derived buffers
ByteBuffer互转换
ByteBuf源码
ByteBuf结构
继承关系
分类
AbstractByteBuf
AbstractReferenceCountedByteBuf
UnpooledHeapByteBuf
PooledByteBuf
PooledDirectByteBuf
辅助类
ByteBufHolder
ByteBufAllocator
CompositeByteBuf
ByteBufUtil
NIO ByteBuffer局限性
- ByteBuffer长度固定,不能动态扩展和收缩。
- ByteBuffer只有一个position标识位置,读写需要flip()和rewind()来翻转,较难控制。
- API功能有限。
ByteBuf功能
基本功能
- 7种基础类型,byte数组,ByteBuffer(ByteBuf)等的读写
- copy,slice等
- 设置字节顺序
- 构造实例
- 操作位置指针
读写功能
ByteBuf通过readIndex和writeIndex协助缓冲区读写操作。0 <= readIndex <= writeIndex <= capacity 。
ByteBuf读写方法分为:
- getXXX(int index):返回指定索引位置的指定类型的值。不改变readIndex和writeIndex。
- readXXX():读取指定类型的值,会修改readIndex的值,根据指定类型增加readIndex。
- setXXX(int index,XXX value):设置指定索引位置的值,不改变readIndex和writeIndex。
- writeXXX(XXX value):写入指定类型的值。会修改writeIndex的值,根据指定类型增加writeIndex。
在每次put操作时,都需要检查剩余空间,如果空间不足,则会创建一个新的ByteBuf
扩容与收缩
- discardReadBytes():收回丢弃空间,内部copy,移动readIdnex,writeIndex。
- clear():清空缓冲区,不填充任何信息,仅修改readIndex,writeIndex为0
- markReaderIndex()和markWriterIndex():
- resetReaderIndex()和resetWriterIndex():
查找
- indexOf(...)
- bytesBefore(...)
- forEachByte(...)
Derived buffers
- duplicate():与源Buffer共享缓冲区。
- copy(...):不与源Buffer共享缓冲区。
- slice(...):与源Buffer共享缓冲区。
ByteBuffer互转换
- nioBuffer(...)
- nioBuffers(...)
ByteBuf源码
ByteBuf结构
继承关系
分类
内存分配角度:
- 堆内存(HeapByteBuf)
内存分配和回收速度快,可以被JVM回收。由于需要做一次内核Copy,性能低。
- 直接内存(DirectByteBuf)
堆外内存,内存分配和回收速度快。不需要做一次内核Copy,性能高。
最佳实践:I/O通信读写缓冲区用DirectByteBuf;业务消息编解码使用HeapByteBuf。
内存回收角度
- 基于池ByteBuf:可以重用ByteBuf。
- 普通ByteBuf
AbstractByteBuf
ResourceLeakDetector leakDetector;
用于检测对象是否泄漏。
AbstractReferenceCountedByteBuf
ReferenceCountUpdater
UnpooledHeapByteBuf
private final ByteBufAllocator alloc;
byte[] array;
private ByteBuffer tmpNioBuf;
PooledByteBuf<T>
private final Recycler.Handle<PooledByteBuf<T>> recyclerHandle;
protected PoolChunk<T> chunk;
protected long handle;
protected T memory;
protected int offset;
protected int length;
int maxLength;
PoolThreadCache cache;
ByteBuffer tmpNioBuf;
private ByteBufAllocator allocator;
PooledDirectByteBuf
辅助类
ByteBufHolder
ByteBufHolder是ByteBuf的容器。
ByteBufAllocator
字节缓冲区分配器。
PooledByteBufAllocator
UnpooledByteBufAllocator
CompositeByteBuf
多个ByteBuf实例组装视图。
ByteBufUtil
工具类
Netty--ByteBuf相关推荐
- Netty ByteBuf(图解之 2)| 秒懂
目录 Netty ByteBuf(图解二):API 图解 源码工程 写在前面 ByteBuf 的四个逻辑部分 ByteBuf 的三个指针 ByteBuf 的三组方法 ByteBuf 的引用计数 Byt ...
- 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...
- 【Netty4】netty ByteBuf (二) 引用计数对象(reference counted objects)
原文出处:http://netty.io/wiki/reference-counted-objects.html 相关文章: netty ByteBuf (一)如何创建ByteBuf对象 netty ...
- Netty - ByteBuf
2019独角兽企业重金招聘Python工程师标准>>> 1.ByteBuf类 - Netty的数据容器 ByteBuf维护了两个不同的索引: readerIndex:用于读取 wri ...
- Netty——ByteBuf的API
ByteBuf 正如前面所提到的,网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它 的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐. Netty 的 Byte ...
- Netty - ByteBuf索引管理
2019独角兽企业重金招聘Python工程师标准>>> 之前写过一篇文章介绍过JDK里面InputStream的mark(readlimit)和reset()方法,Java IO:使 ...
- netty ByteBuf对象池和内存泄漏检测实现走读
该文已重写,请移步: https://blog.csdn.net/weixin_40318210/article/details/108970208 https://blog.csdn.net/wei ...
- Netty中ByteBuf 的零拷贝
转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...
- Netty 学习之旅:ByteBuf 篇之 ByteBuf 内部结构与 API 学习
1.原生 ByteBuffer.ByteBuf 内部结构设计 首先我们来回顾一下 java.nio.ByteBuffe r的内部结构设计. ByteBuffer 内部持有一个 byte[] bt, 再 ...
- Netty(九)——ByteBuf源码之析
ByteBuf在Netty占据着中重要的位置,上篇<Netty--ByteBuf功能之说>讲了ByteBuf的工作原理和重要功能介绍.这篇从源码的角度来看ByteBuf.首先,来看一下主要 ...
最新文章
- C语言取字节的第n二进制,学C语言的看过来,最完整进制转换、整数和小数内存存储模型...
- 最新发布!《阿里云实时计算 Flink 版解决方案白皮书-2021版》开放下载
- 利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温
- 网络编程-HTTPS协议的实现原理
- SVN数据代码迁移Windows2012ServerR2
- Mr.J-- HTTP学习笔记(三)-- HTTP报文
- 工作七年,从实习生到测试主管,我认识到倾听对一个人有多重要!
- Java 使用百度翻译-通用翻译API
- HZNUoj 1875 WA Jiana的游戏
- 跟二项分布相关的统计检验方法
- control reaches end of non-void function [-Wreturn-type] 实例分析
- docker 打包镜像
- web项目bug总结
- java scp发送文件到服务器,Java实现往远程服务器传输文件
- 【路径规划】viroion地图无人机路径规划matlab代码
- 设计模式之中介者模式---Mediator Pattern
- 数字电路的一些基本知识
- 【Geoserver】GeoServer安装GDAL扩展的方法总结
- Windows Linux对应软件
- 三网合一我们该做些什么?