59、Netty源码分析:RecvByteBufAllocator

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

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: