RecvByteBufAllocator
在创建channel的过程中会创建一个相应的配置类,该类存储了一些关于channel的属性,包括分配内存的ByteBufAllocator和预估大小的RecvByteBufAllocator,通过前面的学习我们知道ByteBufAllocator分配内存的时候最终会委托给PoolArena来分配,那么到底分配多大的内存既不浪费又干好够用呢?是由RecvByteBufAllocator来实现的,它的类结构图如下:

默认情况下服务端创建的ServerChannelRecvByteBufAllocator,而客户端则创建的是AdaptiveRecvByteBufAllocator,接下来我们以AdaptiveRecvByteBufAllocator为例来探究RecvByteBufAllocator的工作原理
AdaptiveRecvByteBufAllocator的数据结构如下:

AdaptiveRecvByteBufAllocator有一个静态数组SIZE_TABLE,它初始化了一系列值,过程如下:

每次成功分配内存的时候都会根据它在SIZE_TABLE中的值来判断下次分配的大小,接下来我们就探究它是如何运作的。
先看下AdaptiveRecvByteBufAllocator的构造函数:

接口RecvByteBufAllocator只有一个方法,AdaptiveRecvByteBufAllocator的实现如下:

从中可以看出预估读取数据大小的工作主要是由HandleImpl来实现的,我们看下这个类的结构:

HandleImpl的数据结构如下:

它的构造函数如下:

每次channel读取数据后会记录此次读取了多少数据,记录在HandleImpl中,过程如下:

下次分配的时候获取nextReceiveBufferSize

至此,RecvByteBufAllocator的分析至此结束,感谢阅读。



















