《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配

目录

  • PoolSubPage.allocate
    • getNextAvail方法
    • toHandle方法
    • removeFromPool方法

PoolSubPage.allocate

上一篇我们介绍了PoolSubPage的简单知识,当我们需要PoolSubPage的内存时可调用allocate方法查找可分配二进制的位置,具体的源码过程如下:
《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配_第1张图片

从源码中我们可以看到具体的主要有三步:

  1. 获取可分配的段的位置
  2. 如果subPage已经分配满了则将其从pool中移除
  3. 将得到的bitmapIdx转成handle并返回

下面我们具体分析这三步。

getNextAvail方法

获取下一个可分配的段的位置
《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配_第2张图片

这里说下返回的位置int

  1. 通过上一篇我们知道bitmap数组最多为8,那么findNextAvail方法中的baseVal最大为7*2的6次方,7(111)占三个位置,左移6个位置后,int的7~9位用于记录所申请的段在bitmap数组中的第几个元素
  2. int的0~6位用于记录在long型二进制中的第几位

toHandle方法

将获得的bitmapIdx转成handle指针
《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配_第3张图片

handler其实是一个long型整数,它是一个指针,代表了段的位置的相关信息,long型有64位,每一个位代表的意义如下:

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配_第4张图片

removeFromPool方法

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配_第5张图片

至此,PoolSubPage的内存分配就分析到此。

你可能感兴趣的:(Netty,netty)