Netty内存池设计之总体管理
引言
前文我们分析了内存分配的相关算法,以及其在Netty当中的变种和代码实现。之前在内存块中申请内存,申请大小都大于一个内存页的大小。而如果在申请大小小于一个内存页时也分配一个内存页,就显得很浪费了。为此,Netty设计了专门的子页分配算法,用于处理小内存的分配场景。
子页管理算法
对于小于一个内存页大小的内存申请,首先也是需要在内存块上执行申请的,成功后就会得到一个内存页的空间。现在的问题就转化为一个内存页的空间上,如何避免小内存的申请而浪费一个内存页的剩余空间。最容易的想到的就是将小内存也按照内存块的算法分配思路再来一次。不过内存块的分配算法是需要额外的空间来存储元数据信息(二叉树节点相关信息),如果对于内存页也采用这种模式,元数据信息的开销相比于内存页本身的大小,占比太高,太不划算,显然不能采用这种方式。
在Netty中,对于小内存的分配,是将一个内存页按照小内存的大小,拆成相同大小的N份,将这种模式下的内存页称之为子页。在Netty的内存申请中,所有的申请大小都是按照2的次方幂进行规范化处理的。因此将一个内存页拆分等分的N份,后续仍然会遇到相同大小的小内存申请,就可以直接从这个子页中进行分配,而不需要从内存块中再次申请一个新的内存页,提升了内存页的利用率。
例如说,一个内存页为8k的大小,如果在内存块中申请512大小的内存。假设申请时内存块给分配了一个新的内存页,则内存页会按照512大小进行等分,并且最终给出其中512大小的区域供ByteBuf使用。等分后,内存页会变成如下的样子

其中绿色代表已经分配。而这个内存页后续可以持续参与到512大小的内存申请中,直到以下两个事件发生:
- 按照512等分的内存页已经全部被分配完毕,则无法继续分配。
- 内存页上分配的区域已经全部被归还,则该内存页按照内存块中的回收流程,回收至内存块中。
对于等分后的内存页,每一个等分只有2种状态:使用中,未使用。为了减少管理的开销,netty中采用位图的思路来管理整个等分的内存页。位图,简单的来说,就是通过每一个比特位来标识一个信息。由于比特位只有0和1两种取值,因此很适合于管理是或者否的逻辑。一个long变量,由8个字节,64个比特位构成,因此最大可以管理64个等分的使用信息。
基于上述前提,我们可以将子页的分配算法总结如下:
- 将申请大小规范化,称之为规范大小。如果规范大小小于内存页大小,则走子页分配模式。
- 如果内存块中存在已经处于子页分配模式,且分配大小等于规范大小的内存页,则直接从子页上申请一份区域用于分配;此时分配结束。否则首先从内存块上申请一个全新的内存页,当成子页使用。
- 内存页申请成功的情况下,按照规范大小将内存页的空间等分。按照等分个数,使用位图方式管理每一个等分的使用信息。从全部等分中,获取一份可用的等分,标记其位图坐标为 1 ,表示使用中。使用该内存区域初始化
ByteBuf。 - 将该子页放在”内存池“中管理。后续如果有相同规范大小的申请,则优先尝试从未全部分配的子页上获取。
- 每次从子页取走一个等分用于内存使用时,对应的位图标志位设置为1;当该等分被归还时,对应的位图标志位复位回0。
通过对内存页的大小等分和位图管理方式,有效的提高了在小内存申请情况下,内存页的利用率。
内存池
聊完了子页分配算法,我们再来内存池的整体分配逻辑。小内存的申请与归还实际上由内存池自身负责,而不是在内存块中完成,因此这里将子页分配和内存池的整体管理放在一起阐明。
内存池是内存申请与分配的入口,内存池本身不参与内存的分配,但是其负责管理内存块和用于共享的按照小内存申请大小等分后的子页。
内存块管理
先说对内存块的管理。在内存池中,存储着一定数量的内存块。Netty 使用PoolChunkList内存块列表来存储PoolChunk内存块。PoolChunk内部有属性next和prev,用于指向自己的前驱和后继节点。而PoolChunkList中则存储着PoolChunk链表的头结点。此外,PoolChunkList自身也通过nextList和prevList属性构成了一个双向链表。用图的方式来形象表达就是

在同一个PoolChunkList中的PoolChunk,都是有着相同的使用率。在内存池中,管理着6个使用率区间的PoolChunkList,分别是:
qInit:存储着使用率 0%~25% 的PoolChunk。q000:存储着使用率 1%~50% 的PoolChunk。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> 通过本专刊的学习,对网络开发所需掌握的基础理论知识会更加牢固,对网络应用涉及的线程模型,设计模式,高性能架构等更加明确。通过对Netty的源码深入讲解,使得读者对Netty达到“知其然更之所以然”的程度。在遇到一些线上的问题时,具备了扎实理论功底的情况,可以有的放矢而不会显得盲目。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>
查看5道真题和解析