目录

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通过readIndexwriteIndex协助缓冲区读写操作。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相关推荐

  1. Netty ByteBuf(图解之 2)| 秒懂

    目录 Netty ByteBuf(图解二):API 图解 源码工程 写在前面 ByteBuf 的四个逻辑部分 ByteBuf 的三个指针 ByteBuf 的三组方法 ByteBuf 的引用计数 Byt ...

  2. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

    根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  3. 【Netty4】netty ByteBuf (二) 引用计数对象(reference counted objects)

    原文出处:http://netty.io/wiki/reference-counted-objects.html 相关文章: netty ByteBuf (一)如何创建ByteBuf对象 netty ...

  4. Netty - ByteBuf

    2019独角兽企业重金招聘Python工程师标准>>> 1.ByteBuf类 - Netty的数据容器 ByteBuf维护了两个不同的索引: readerIndex:用于读取 wri ...

  5. Netty——ByteBuf的API

    ByteBuf 正如前面所提到的,网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它 的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐. Netty 的 Byte ...

  6. Netty - ByteBuf索引管理

    2019独角兽企业重金招聘Python工程师标准>>> 之前写过一篇文章介绍过JDK里面InputStream的mark(readlimit)和reset()方法,Java IO:使 ...

  7. netty ByteBuf对象池和内存泄漏检测实现走读

    该文已重写,请移步: https://blog.csdn.net/weixin_40318210/article/details/108970208 https://blog.csdn.net/wei ...

  8. Netty中ByteBuf 的零拷贝

    转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...

  9. Netty 学习之旅:ByteBuf 篇之 ByteBuf 内部结构与 API 学习

    1.原生 ByteBuffer.ByteBuf 内部结构设计 首先我们来回顾一下 java.nio.ByteBuffe r的内部结构设计. ByteBuffer 内部持有一个 byte[] bt, 再 ...

  10. Netty(九)——ByteBuf源码之析

    ByteBuf在Netty占据着中重要的位置,上篇<Netty--ByteBuf功能之说>讲了ByteBuf的工作原理和重要功能介绍.这篇从源码的角度来看ByteBuf.首先,来看一下主要 ...

最新文章

  1. C语言取字节的第n二进制,学C语言的看过来,最完整进制转换、整数和小数内存存储模型...
  2. 最新发布!《阿里云实时计算 Flink 版解决方案白皮书-2021版》开放下载
  3. 利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温
  4. 网络编程-HTTPS协议的实现原理
  5. SVN数据代码迁移Windows2012ServerR2
  6. Mr.J-- HTTP学习笔记(三)-- HTTP报文
  7. 工作七年,从实习生到测试主管,我认识到倾听对一个人有多重要!
  8. Java 使用百度翻译-通用翻译API
  9. HZNUoj 1875 WA Jiana的游戏
  10. 跟二项分布相关的统计检验方法
  11. control reaches end of non-void function [-Wreturn-type] 实例分析
  12. docker 打包镜像
  13. web项目bug总结
  14. java scp发送文件到服务器,Java实现往远程服务器传输文件
  15. 【路径规划】viroion地图无人机路径规划matlab代码
  16. 设计模式之中介者模式---Mediator Pattern
  17. 数字电路的一些基本知识
  18. 【Geoserver】GeoServer安装GDAL扩展的方法总结
  19. Windows Linux对应软件
  20. 三网合一我们该做些什么?

热门文章

  1. jenkins无法安装插件问题
  2. 巧用云计算 突围移动APP行业乱象
  3. jQuery获取Table某列的值
  4. SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数
  5. hadoop SecondaryNameNode和NameNode
  6. 收藏老外的jquery web 按钮插件
  7. 零基础入门 HTML 的 8 分钟极简教程
  8. 史上最全Python课程整理——我是如何从编程小白到Python研发工程师的
  9. Centos最小化装机网络问题
  10. Nacos分布式应用配置管理