前言

在网络传输过程中,字节是最基本也是最小的单元。JAVA NIO有提供一个ByteBuffer容器去装载这些数据,但是用起来会有点复杂,经常要在读写间进行切换以及不支持动态扩展等等。而netty为我们提供了一个ByteBuf组件,功能是很强大的,本文主要对ByteBuf进行一些讲解,中间会穿插着和ByteBuffer进行对比。

优势

ByteBuf与ByteBuffer的相比的优势:
读和写用不同的索引。
读和写可以随意的切换,不需要调用flip()方法。
容量能够被动态扩展,和StringBuilder一样。
用其内置的复合缓冲区可实现透明的零拷贝。
支持方法链。
支持引用计数。count == 0,release。
支持池。

读写索引

ByteBuffer读写同用position索引,利用flip()方法切换读写模式,而ByteBuf读写分不同的索引,读用readIndex,写用writeIndex,这样可以更加方便我们进行操作,省去了flip这一步骤。ByteBuffer与ByteBuf两种读写模型会在下面用图解形式给大家进行说明。

动态扩展

ByteBuffer是不支持动态扩展的,给定一个具体的capacity,一旦put进去的数据超过其容量,就会抛出java.nio.BufferOverflowException异常,而ByteBuf完美的解决了这一问题,支持动态扩展其容量。

零拷贝

netty提供了CompositeByteBuf类实现零拷贝。大多数情况下,在进行网络数据传输时我们会将消息分为消息头head和消息体body

这里通过CompositeByteBuf 对象将headerBuf 与bodyBuf组合到了一起,也得到了完整的消息体,但是并未进行内存上的拷贝。可以注意下我在上面代码段中进行的buf.toString()方法的调用,得出来的结果是:指向的还是原来分配的空间地址,也就证明了零拷贝的观点。

支持引用计数

引用计数器实现的原理并不复杂,仅仅只是涉及到一个指定对象的活动引用,对象被初始化后引用计数值为1。只要引用计数大于0,这个对象就不会被释放,当引用计数减到为0时,这个实例就会被释放,被释放的对象不应该再被使用。

支持池

Netty对ByteBuf的分配提供了池支持,具体的类是PooledByteBufAllocator。用这个分配器去分配ByteBuf可以提升性能以及减少内存碎片。Netty中默认用PooledByteBufAllocator当做ByteBuf的分配器。PooledByteBufAllocator对象可以从Channel中或者绑定了Channel的ChannelHandlerContext中去获取到。

Netty谈谈ByteBuf相关推荐

  1. Netty 的 ByteBuf 是如何支持 堆内存非池化 实现的

    Netty的ByteBuf是如何支持堆内存非池化实现的 ByteBuffer 从实现方式上分成 HeapByteBuffer 和 DirectByteBuffer 两种内存实现方式, HeapByte ...

  2. Netty 教程 – ByteBuf详解

    ByteBuffer存在的问题 ByteBuffer是JDK1.4中提供的java.nio.Buffer, 在内存中预留指定大小的存储空间来存放临时数据,其他Buffer的子类有:CharBuffer ...

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

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

  4. Netty中ByteBuf 的零拷贝

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

  5. Netty Associated -- ByteBuf

    ByteBuf ByteBuf是Netty的Server与Client之间通信的数据传输载体.他提供了一个byte数组(byte[])的抽象视图 buffer创建 我们推荐通过一个Unpooled的帮 ...

  6. Netty之ByteBuf详解

    1. ByteBuf的创建 在Netty中,有一个比较常见的对象ByteBuf,它其实等同于Java Nio中的ByteBuffer,但是ByteBuf对Nio中的ByteBuffer的功能做了很作增 ...

  7. Netty中ByteBuf的copy、duplicate、slice方法对比

    Jdk注释翻译 /** *返回ByteBuf的可读字节的拷贝.修改返回的ByteBuf内容与当前ByteBuf完全不会相互影响. *此方法不会修改当前ByteBuf的readerIndex或write ...

  8. 【Netty】Netty为什么要手动释放ByteBuf资源?

    ByteBuf是Netty网络通信框架中一个重要的组件.先进和友好的设计理念让开发者受益匪浅. 两个指针操作ByteBuf -> 读和写 对象池技术 -> 非垃圾回收机制 对象池技术 对象 ...

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

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

最新文章

  1. 读阿里许令波老师晋升评审有感
  2. Java黑皮书课后题第3章:*3.17(游戏:剪刀、石头、布)编写可以玩流行的剪刀-石头-布游戏的程序
  3. php常驻对象,php对象
  4. oracle数据库如何写翻页_oracle数据库如何写翻页
  5. reStructuredText
  6. Storm与Spark区别
  7. 吴恩达神经网络和深度学习-学习笔记-7-正则化regularization方法
  8. 基于Springboot的医院药品管理系统的设计与实现.zip(论文+项目源码)
  9. 总结-模型评价指标的定义(基于CatBoost文档)
  10. 安卓应用市场互相抓取app包
  11. Netty处理器的小技巧和Netty大文件传输方法思路
  12. 电脑用cmd命令将手机中的文件导入电脑中
  13. 基于 arduino 的两轮自行车
  14. 初米 php,什么字帖练字好初中米字格a4设置
  15. SQLyog连接linux数据库问题
  16. 学习写微信小程序(2)
  17. 桥接,NAT,Host Only的区别
  18. Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
  19. 笨办法学python3 学习笔记 习题20-21
  20. 理解Linemod匹配算法

热门文章

  1. sudo -S可以不用手动输入密码,且只要第一次密码正确,后面在有效期内,密码错误也可以
  2. 自动编码器python_算法进阶(一)之自动编码器
  3. apache2日志分析软件linux,apache日志分析工具安装
  4. 直流电源纹波测量(示波器)
  5. 视频教程-华为网络工程师HCIA数通工程师-华为认证
  6. 无人驾驶---1 激光雷达的地面-非地面分割和pcl_ros实践
  7. MOS管怎么测试好坏-如何测试有五种诀窍-KIA MOS管
  8. python中如何修改字符串的值_python中修改字符串的5种方法!
  9. 公众号内资源提供(持续更新中)--category
  10. Pycharm工具专业版完美破解