netty之channelbuffer

看过英文的文档源码,仍是勉强解释下,分享 数组

 ChannelBuffer的实现类有多个,这里列举其中主要的几个: 网络

  1)HeapChannelBuffer:这是Netty读网络数据时默认使用的ChannelBuffer,这里的Heap就是Java堆的意 思,由于 读SocketChannel的数据是要通过ByteBuffer的,而ByteBuffer实际操做的就是个byte数组,因此 ChannelBuffer的内部就包含了一个byte数组,使得ByteBuffer和ChannelBuffer之间的转换是零拷贝方式。根据网络字 节续的不一样,HeapChannelBuffer又分为BigEndianHeapChannelBuffer和 LittleEndianHeapChannelBuffer,默认使用的是BigEndianHeapChannelBuffer。Netty在读网络 数据时使用的就是HeapChannelBuffer,HeapChannelBuffer是个大小固定的buffer,为了避免至于分配的Buffer的 大小不太合适,Netty在分配Buffer时会参考上次请求须要的大小。 多线程

  2)DynamicChannelBuffer:相比于HeapChannelBuffer,DynamicChannelBuffer可动态自适 应大 小。对于在DecodeHandler中的写数据操做,在数据大小未知的状况下,一般使用DynamicChannelBuffer。 socket

  3)ByteBufferBackedChannelBuffer:这是directBuffer,直接封装了ByteBuffer的 directBuffer。 线程

  对于读写网络数据的buffer,分配策略有两种:1)一般出于简单考虑,直接分配固定大小的buffer,缺点是,对一些应用来讲这个大小限制有 时是不 合理的,而且若是buffer的上限很大也会有内存上的浪费。2)针对固定大小的buffer缺点,就引入动态buffer,动态buffer之于固定 buffer至关于List之于Array。 code

  buffer的寄存策略常见的也有两种(实际上是我知道的就限于此):1)在多线程(线程池) 模型下,每一个线程维护本身的读写buffer,每次处理新的请求前清空buffer(或者在处理结束后清空),该请求的读写操做都须要在该线程中完成。 2)buffer和socket绑定而与线程无关。两种方法的目的都是为了重用buffer。 对象

  Netty对buffer的处理策略是:读 请求数据时,Netty首先读数据到新建立的固定大小的HeapChannelBuffer中,当HeapChannelBuffer满或者没有数据可读 时,调用handler来处理数据,这一般首先触发的是用户自定义的DecodeHandler,由于handler对象是和ChannelSocket 绑定的,因此在DecodeHandler里能够设置ChannelBuffer成员,当解析数据包发现数据不完整时就终止这次处理流程,等下次读事件触 发时接着上次的数据继续解析。就这个过程来讲,和ChannelSocket绑定的DecodeHandler中的Buffer一般是动态的可重用 Buffer(DynamicChannelBuffer),而在NioWorker中读ChannelSocket中的数据的buffer是临时分配的 固定大小的HeapChannelBuffer,这个转换过程是有个字节拷贝行为的。 接口

  对ChannelBuffer的建立,Netty内部使用的是ChannelBufferFactory接口,具体的实现有 DirectChannelBufferFactory和HeapChannelBufferFactory。对于开发者建立 ChannelBuffer,可以使用实用类ChannelBuffers中的工厂方法。 事件

相关文章
相关标签/搜索