> 文章列表 > 《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

runsAvail

runsAvail用于记录long型的指针值,是一个LongPriorityQueue数组LongPriorityQueue的结构如下:

《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

array数组用于存储handle的值,其中下标对应SizeClasses中pageIdx,size为array数组的大小size的大小取值过程如下:

  1. chunk的默认大小为4MB,page大小为8kb
  2. pages为4MB/8KB=512,对应的pageIdx为512
  3. 故runsAvail的size为32

再看PoolChunk中对runsAvail的初始化:
《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

我们举个例子来加深理解,如下图:

《Netty》从零开始学netty源码(四十一)之PoolChunk.runsAvail

  1. 申请的大小为262144(256KB),对应表格中的pageIdx为15的行,则从下标15开始遍历runsAvail数组寻找第一个空闲的long,从分配前的handle情况来看只有下标为30的有空闲的,则向其申请pages为32的空间
  2. 申请之前runOffset为1,空闲的pages为511(111111111)
  3. 申请了32个pages之后,空闲的pages为479(511-32),即(111 011111),runOffset则变为33(32+1),即(100001)。

至此,runsAvail的分析至此完毕。

全文完,如果觉得文章有点意思,不妨点个“赞”或者“在看”吧,您的每一份正反馈都是对三横兰写作的最大肯定,感谢阅读_

每天坚持一点点,每天进步一点点

坚持是日复一日,质变需日积月累

我是三横兰,那个三横的兰