前言
前面聊了大于8KB的内存分配,那小于8KB的呢?上一篇的平衡二叉树第十一层的叶子节点最小也是8KB,那比如要分配128B的缓存,直接分给8KB显然是不合适的,Tiny是小于512Byte,Small介于512B~8KB,Tiny和Small统称Subpage,本文就聊聊他们的内存分配情况,这块应该是整个netty最为复杂的部分了。
一
内容提要
下面是以分配128B为例的整体流程架构图,下面大体叙述下其流程。
先从平衡二叉树的第11层选一个未分配的叶子节点大小为8KB的一个Page
备注:本例中为memoryMap[2048]对该Page进行切割,假如要分配128B,整体会切割为64块
备注:8192/128=64通过long类型二进制64位来标记分割成各个块的分配状态
备注:0:未分配,1:已分配
一个bitmap数组长度为8,每个元素都能对64块内存进行标记
建立了二叉树节点与切分块之间的映射关系
备注:memoryMapIdx ^ maxSubpageAllocs分配后建立二叉树叶子节点与标记位之间的关系,可以指向内存一块区域
备注:0x4000000000000000L | (long) bitmapIdx << 32 | memoryMapIdx

二
源码分析
示例代码
@Test
public void testAllocateSubpage() {
ByteBufAllocator allocator = new PooledByteBufAllocator();
allocator.directBuffer(128);
}
备注:以分配128B的内存为例,分析其分配过程。
源码分析
private long allocateSubpage(int normCapacity) {
PoolSubpage<T> head = arena.findSubpagePoolHead(normCapacity); // 注解@1
int d =