40、Netty源码分析:PoolSubPage的内存分配

目录

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

PoolSubPage.allocate

上一篇我们介绍了PoolSubPage的简单知识,当我们需要PoolSubPage的内存时可调用allocate方法查找可分配二进制的位置,具体的源码过程如下:
*

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

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

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

getNextAvail方法

获取下一个可分配的段的位置
*

这里说下返回的位置int

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

toHandle方法

将获得的bitmapIdx转成handle指针
*

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

*

removeFromPool方法

*

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

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