59、Netty源码分析:RecvByteBufAllocator

本文深入剖析了Netty中RecvByteBufAllocator的核心机制,重点讲解了AdaptiveRecvByteBufAllocator如何通过SIZE_TABLE和HandleImpl动态调整内存分配大小,以实现高效且不浪费的ByteBuf分配策略,适用于网络编程和性能优化。

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

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