Netty之缓冲区ByteBuf解读(一)】的更多相关文章

Netty 在数据传输过程中,会使用缓冲区设计来提高传输效率.虽然,Java 在 NIO 编程中已提供 ByteBuffer 类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也存在一定的不足.所以高性能的 Netty 框架实现了一套更加强大,完善的 ByteBuf,其设计理念也是堪称一绝. ByteBuffer 分析 在分析 ByteBuf 之前,先简单讲下 ByteBuffer 类的操作.便于更好理解 ByteBuf . ByteBuffer 的读写操作共用一个位置指针,读写过程通过…
上篇介绍了 ByteBuf 的简单读写操作以及读写指针的基本介绍,本文继续对 ByteBuf 的基本操作进行解读. 读写指针回滚 这里的 demo 例子还是使用上节使用的. ByteBuf buf = Unpooled.buffer(15); String content = "ytao公众号"; buf.writeBytes(content.getBytes()); System.out.println(String.format("\nwrite: ridx=%s wid…
Netty buffer缓冲区ByteBuf byte 作为网络传输的基本单位,因此数据在网络中进行传输时需要将数据转换成byte进行传输.netty提供了专门的缓冲区byte生成api ByteBuf. Buffer API主要包括: ByteBuf ByteBufHolder Netty 缓冲 API 提供了几个优势: 可以自定义缓冲类型 通过一个内置的复合缓冲类型实现零拷贝 扩展性好,比如 StringBuilder 不需要调用 flip() 来切换读/写模式 读取和写入索引分开 方法链…
网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它 的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐. Netty 的 ByteBuffer 替代品是 ByteBuf,一个强大的实现,既解决了 JDK API 的局限性, 又为网络应用程序的开发者提供了更好的 API. 一.ByteBuf 的 API Netty 的数据处理 API 通过两个组件暴露——abstract class ByteBuf 和 interface ByteBufHolder. 下面是一…
什么是ByteBuf? ByteBuf在Netty中充当着非常重要的角色:它是在数据传输中负责装载字节数据的一个容器;其内部结构和数组类似,初始化默认长度为256,默认最大长度为Integer.MAX_VALUE. ByteBuf数据结构 * <pre> * +-------------------+------------------+------------------+ * | discardable bytes | readable bytes | writable bytes | *…
ByteBuf ByteBuf是什么 ByteBuf重要API read.write.set.skipBytes mark和reset duplicate.slice.copy retain.release ByteBuf扩容 ByteBuf种类 ByteBufAllocate UnPooledByteBufAllocate newHeapBuffer newDirectBuffer ByteBuf ByteBuf是什么 为了平衡数据传输时CPU与各种IO设备速度的差异性,计算机设计者引入了缓冲…
目录 Netty中的ByteBuf优势 NIO使用的ByteBuffer有哪些缺点 ByteBuf的优势和做了哪些增强 ByteBuf操作示例 ByteBuf操作 简单的Demo示例 堆内和堆外内存 ByteBuf动态扩容 ByteBuf有哪些实现 ByteBuf类图 Unpooled.buffer分配方式 Unpooled.directBuffer分配方式 ByteBufAllocator类图 ByteBuf内存复用 分配池化内存 内存缓存池 回收池化内存 分配池化内存的过程 内存回收的过程…
概述 网络数据的基本单位总是字节,Java NIO 提供了 ByteBuffer 作为它的字节容器,但这个类的使用过于复杂.Netty 的 ByteBuf 具有卓越的功能性和灵活性,可以作为 ByteBuffer 的替代品 Netty 的数据处理 API 通过两个组件暴露 -- abstract class ByteBuf 和 interface ByteBufHolder,下面是 ByteBuf API 的优点: 可以被用户自定义的缓冲区类型扩展 通过内置的复合缓冲区类型实现透明的零拷贝 容量…
目录 简介 ByteBuf详解 创建一个Buff 随机访问Buff 序列读写 搜索 其他衍生buffer方法 和现有JDK类型的转换 总结 简介 netty中用于进行信息承载和交流的类叫做ByteBuf,从名字可以看出这是Byte的缓存区,那么ByteBuf都有哪些特性呢?一起来看看. ByteBuf详解 netty提供了一个io.netty.buffer的包,该包里面定义了各种类型的ByteBuf和其衍生的类型. netty Buffer的基础是ByteBuf类,这是一个抽象类,其他的Buff…
目录 简介 ByteBuf和ByteBuffer的可扩展性 不同的使用方法 性能上的不同 总结 简介 netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中.同样是NIO,netty所依赖的JDK在1.4版本中早就提供nio的包,既然JDK已经有了nio的包,为什么netty还要再写一个呢? 不是因为JDK不优秀,而是因为netty的要求有点高. ByteBuf和ByteBuffer的可扩展性 在讲解netty中的ByteBuf如何优秀之前,我们先来看一下netty中的ByteBu…
Netty in action—Netty中的ByteBuf - 日积月累 - CSDN博客 https://blog.csdn.net/yjw123456/article/details/77843931…
参考https://blog.csdn.net/wangjinnan16/article/details/77972113 派生缓冲区 派生缓冲区,也就是创建一个已经存在的缓冲区的视图,可以调用duplicate(),slice(),slice(int, int), readOnly()和order(ByteOrder)等方法实现.派生缓冲区会产生自己的读写索引和其他标记索引,但是他们共享内部的数据.因为它们共享内部的数据,所以创建派生缓冲是没有什么性能损耗的,而且是比较好的方式,例如你想拥有一…
由于JDK中提供的ByteBuffer无法动态扩容,并且API使用复杂等原因,Netty中提供了ByteBuf.Bytebuf的API操作更加便捷,可以动态扩容,提供了多种ByteBuf的实现,以及高效的零拷贝机制. ByteBuf的操作 ByteBuf有三个重要的属性:capacity容量,readerIndex读取位置,writerIndex写入位置提供了readerIndex和weiterIndex两个变量指针来支持顺序读和写操作 下图显示了一个缓冲区是如何被两个指针分割成三个区域的: 代…
在Netty中,还有另外一个比较常见的对象ByteBuf,它其实等同于Java Nio中的ByteBuffer,但是ByteBuf对Nio中的ByteBuffer的功能做了很作增强,下面我们来简单了解一下ByteBuf. 下面这段代码演示了ByteBuf的创建以及内容的打印,这里显示出了和普通ByteBuffer最大的区别之一,就是ByteBuf可以自动扩容,默认长度是256,如果内容长度超过阈值时,会自动触发扩容 public class ByteBufExample { public sta…
本文参考 本篇文章是对<Netty In Action>一书第五章"ByteBuf"的学习摘记,主要内容为JDK 的ByteBuffer替代品ByteBuf的优越性 你可能注意到我跳过了第四章"传输",因为第四章主要是对各种传输类型的简单介绍和如何选择的说明,在之后的几个章节中,我们还会再碰到,如用于单元测试的Embedded传输 ByteBuf工作方式 ByteBuf provides two pointer variables to support…
内存池ByteBuf 内存回收: 在前面的章节中我们有提到, 堆外内存是不受JVM 垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf 操作时, 使用完毕要对对象进行回收, 本节就以PooledUnsafeDirectByteBuf 为例讲解有关内存分配的相关逻辑.PooledUnsafeDirectByteBuf 中内存释放的入口方法是其父类AbstractReferenceCountedByteBuf 中的release()方法: public boolean release(…
最近笔者接触到串口编程,网上搜了些资料,顺便整理一下.网上都在推荐使用Java RXTX开源类库,它提供了Windows.Linux等不同操作系统下的串口和并口通信实现,遵循GNU LGPL协议.看起来不错,写个例子试试. 准备运行环境 下载RXTX RXTX下载地址是:http://fizzed.com/oss/rxtx-for-java 笔者操作系统是Windows10,下载对应版本的压缩包,解压后复制RXTXcomm.jar到D:\Program Files\Java\jdk1.8.0_1…
Netty源码分析第五章: ByteBuf 第三节: 缓冲区分配器 缓冲区分配器, 顾明思议就是分配缓冲区的工具, 在netty中, 缓冲区分配器的顶级抽象是接口ByteBufAllocator, 里面定义了有关缓冲区分配的相关api 抽象类AbstractByteBufAllocator实现了ByteBufAllocator接口, 并且实现了其大部分功能 和AbstractByteBuf一样, AbstractByteBufAllocator也实现了缓冲区分配的骨架逻辑, 剩余的交给其子类 以…
1. 概念 Java NIO API自带的缓冲区类功能相当有限,没有经过优化,使用JDK的ByteBuffer操作更复杂.故而Netty的作者Trustin Lee为了实现高效率的网络传输,重新造轮子,Netty中的ByteBuf实际上就相当于JDK中的ByteBuffer,其作用是在Netty中通过Channel传输数据. 2. 优势 可以自定义缓冲类型: 通过内置的复合缓冲类型,实现透明的零拷贝(zero-copy): 不需要调用flip()来切换读/写模式: 读取和写入索引分开: 方法链:…
一.ByteBuf工作原理 1. ByteBuf是ByteBuffer的升级版: jdk中常用的是ByteBuffer,从功能角度上,ByteBuffer可以完全满足需要,但是有以下缺点: ByteBuffer一旦分配完成,长度固定,不能动态扩展和收缩,当需要编码的POJO对象大于分配容量时发生索引越界异常 ByteBuffer只要一个标识位置的指针postion,读写切换比较麻烦,flip rewind等操作 功能有限 ByteBuf依然是Byte数组缓冲区,拥有ByteBuffer的一切功能…
一.前言 前面已经学习了Netty中传输部分,现在接着学习Netty中的ByteBuf. 二.ByteBuf 2.1 ByteBuf API 在网络上传输的数据形式为Byte,Java NIO提供了ByteBuffer来作为Byte容器,该类有些复杂,而Netty使用ByteBuf作为ByteBuffer的替换方案,其提供了一个更好的API, Netty通过ByteBuf和ByteBufHolder两个组件处理数据,而ByteBuf的API有如下优势 · 可扩展的用户定义的缓冲区类型 · 通过内…
网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐. Netty的ByteBuffer替代品是ByteBuf,一个强大的实现,即解决了JDK API的局限性,又为网络应用程序的开发者提供了更好的API. 1.ByteBuf的API Netty的数据处理API通过两个组件暴露——abstract class ByteBuf 和 interface ByteBufHolder. 以下是其优点: -可以被用户自定义的缓冲区类型扩展 -通过内置…
一.概述和原理 网络数据传输的基本单位总是字节,Netty 提供了 ByteBuf 作为它的字节容器,既解决了 JDK API 的局限性,又为网络应用程序提供了更好的 API,ByteBuf 的优点: 1.可以被用户自定义的缓冲区类型扩展2.通过内置的复合缓冲区类型实现了透明的零拷贝3.容量可以按需增长4.在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip()方法5.读和写使用了不同的索引6.支持方法的链式调用7.支持引用计数8.支持池化 ByteBuf通过两个索引(rea…
摘要: 在JAVA NIO相关的组件中,ByteBuffer是除了Selector.Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写入Channel,或是从Channel读入Buffer:而在Netty中,被精心设计的ByteBuf则是Netty贯穿整个开发过程中的核心缓冲区,那么他们俩有什么区别呢?Netty对于缓冲区的设计对于高性能应用又带来了哪些值得借鉴的思路呢?本文在介绍ByteBuffer和ByteBuf基本概念的基础…
 Netty 中使用 ByteBuf 代替 Java NIO 提供的 ByteBuffer 作为字节的容器. 一.索引 ByteBuf 提供两个指针变量支持读和写操作,读操作使用 readerIndex,写操作使用 writerIndex.如下图: 可丢弃字节,因为它们已经被读 可读字节,已写入但还没有被读取 可写字节 二.索引管理 调用 markReaderIndex(), markWriterIndex(), resetReaderIndex() 和 resetWriterIndex() 来…
netty重新定义了byteBuf 而没使用jdk byteBuffer netty byteBuf与jdk  byteBuffer的区别 (1)jdk buffer长度固定  byteBuf超过最大索引 将会扩容.(最大值默认值是Integer.MAXVALUE) (4)读取和写入的索引分开了(readIndex/WriterIndex),不像JDK中使用一个索引 优点: jdk 读写都是一个索引 节省了变量 读时都需要调用flip切换  写入时需要clear清空  读时不能写(nettyBu…
ByteBuf是Netty中主要的数据容器与操作工具,也是Netty内存管理优化的具体实现,本章我们先从整体上对ByteBuf进行一个概述: AbstractByteBuf是整个ByteBuf的框架类,定义了各种重要的标志位与API供具体的实现类使用与实现:下面我们就从AbstractByteBuf类入手对ByteBuf的读写机制与API进行一个简单的介绍 private static final InternalLogger logger = InternalLoggerFactory.get…
本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现. 源码分析基于Netty 4.1.52 Netty中的零拷贝 Netty中零拷贝机制主要有以下几种 1.文件传输类DefaultFileRegion#transferTo,调用FileChannel#transferTo,直接将文件缓冲区的数据发送到目标Channel,减少用户缓冲区的拷贝(通过linux的sendfile函数). 使用read 和 write过程如下 使用sendfile 可以看到,使用sendfile函数可…
本文内容主要参考<<Netty In Action>>,偏笔记向. 网络编程中,字节缓冲区是一个比较基本的组件.Java NIO提供了ByteBuffer,但是使用过的都知道ByteBuffer对于读写数据操作还是有些麻烦的,切换读写状态需要flip().Netty框架对字节缓冲区进行了封装,名称是ByteBuf,相较于ByteBuffer更灵活. 1.ByteBuf特点概览 用户可以自定义缓冲区类型对其扩展 通过内置的符合缓冲区类型实现了透明的零拷贝 容量可以按需增长(类似Str…
因为jdk ByteBuffer使用起来很麻烦,所以netty研发出ByteBuf对象维护管理内存使用ByteBuf有几个概念需要知道1.向ByteBuf提取数据时readerIndex记录最后读取坐标,目的是下次从readerIndex开始读2.向ByteBuf写入数据时writerIndex记录最后写数据坐标3.提取数据范围是readerIndex<=writerIndex,因为先写入数据然后才能读取数据4.自动扩容,当writerIndex达到一定阀值时,会扩大capacity 所以Byt…