Netty谈谈ByteBuf
前言
在网络传输过程中,字节是最基本也是最小的单元。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相关推荐
- Netty 的 ByteBuf 是如何支持 堆内存非池化 实现的
Netty的ByteBuf是如何支持堆内存非池化实现的 ByteBuffer 从实现方式上分成 HeapByteBuffer 和 DirectByteBuffer 两种内存实现方式, HeapByte ...
- Netty 教程 – ByteBuf详解
ByteBuffer存在的问题 ByteBuffer是JDK1.4中提供的java.nio.Buffer, 在内存中预留指定大小的存储空间来存放临时数据,其他Buffer的子类有:CharBuffer ...
- Netty(九)——ByteBuf源码之析
ByteBuf在Netty占据着中重要的位置,上篇<Netty--ByteBuf功能之说>讲了ByteBuf的工作原理和重要功能介绍.这篇从源码的角度来看ByteBuf.首先,来看一下主要 ...
- Netty中ByteBuf 的零拷贝
转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...
- Netty Associated -- ByteBuf
ByteBuf ByteBuf是Netty的Server与Client之间通信的数据传输载体.他提供了一个byte数组(byte[])的抽象视图 buffer创建 我们推荐通过一个Unpooled的帮 ...
- Netty之ByteBuf详解
1. ByteBuf的创建 在Netty中,有一个比较常见的对象ByteBuf,它其实等同于Java Nio中的ByteBuffer,但是ByteBuf对Nio中的ByteBuffer的功能做了很作增 ...
- Netty中ByteBuf的copy、duplicate、slice方法对比
Jdk注释翻译 /** *返回ByteBuf的可读字节的拷贝.修改返回的ByteBuf内容与当前ByteBuf完全不会相互影响. *此方法不会修改当前ByteBuf的readerIndex或write ...
- 【Netty】Netty为什么要手动释放ByteBuf资源?
ByteBuf是Netty网络通信框架中一个重要的组件.先进和友好的设计理念让开发者受益匪浅. 两个指针操作ByteBuf -> 读和写 对象池技术 -> 非垃圾回收机制 对象池技术 对象 ...
- Netty ByteBuf(图解之 2)| 秒懂
目录 Netty ByteBuf(图解二):API 图解 源码工程 写在前面 ByteBuf 的四个逻辑部分 ByteBuf 的三个指针 ByteBuf 的三组方法 ByteBuf 的引用计数 Byt ...
最新文章
- 读阿里许令波老师晋升评审有感
- Java黑皮书课后题第3章:*3.17(游戏:剪刀、石头、布)编写可以玩流行的剪刀-石头-布游戏的程序
- php常驻对象,php对象
- oracle数据库如何写翻页_oracle数据库如何写翻页
- reStructuredText
- Storm与Spark区别
- 吴恩达神经网络和深度学习-学习笔记-7-正则化regularization方法
- 基于Springboot的医院药品管理系统的设计与实现.zip(论文+项目源码)
- 总结-模型评价指标的定义(基于CatBoost文档)
- 安卓应用市场互相抓取app包
- Netty处理器的小技巧和Netty大文件传输方法思路
- 电脑用cmd命令将手机中的文件导入电脑中
- 基于 arduino 的两轮自行车
- 初米 php,什么字帖练字好初中米字格a4设置
- SQLyog连接linux数据库问题
- 学习写微信小程序(2)
- 桥接,NAT,Host Only的区别
- Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
- 笨办法学python3 学习笔记 习题20-21
- 理解Linemod匹配算法
热门文章
- sudo -S可以不用手动输入密码,且只要第一次密码正确,后面在有效期内,密码错误也可以
- 自动编码器python_算法进阶(一)之自动编码器
- apache2日志分析软件linux,apache日志分析工具安装
- 直流电源纹波测量(示波器)
- 视频教程-华为网络工程师HCIA数通工程师-华为认证
- 无人驾驶---1 激光雷达的地面-非地面分割和pcl_ros实践
- MOS管怎么测试好坏-如何测试有五种诀窍-KIA MOS管
- python中如何修改字符串的值_python中修改字符串的5种方法!
- 公众号内资源提供(持续更新中)--category
- Pycharm工具专业版完美破解