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的分析至此结束,感谢阅读。