上一篇【第57篇】PoolChunk内存分配源码全解析——buddy算法的工程实现下一篇【第59篇】RecvByteBufAllocator源码解析——动态调整接收缓冲区一、Subpage规格一次Page(8KB)可按规格切割 规格16B → 512块 (8KB/16B) 规格32B → 256块 规格64B → 128块 规格128B → 64块 规格256B → 32块 规格512B → 16块 规格1KB → 8块 规格2KB → 4块 规格4KB → 2块二、bitmap分配finalclassPoolSubpageT{finallong[]bitmap;// 位图每个bit代表一块longallocate(){intbitmapIdxgetNextAvail();// 找第一个0的bitintqbitmapIdx6;// bitmap[?]intrbitmapIdx63;// 第几位bitmap[q]|1Lr;// 标记为1已分配returntoHandle(bitmapIdx);}booleanfree(intbitmapIdx){intqbitmapIdx6;intrbitmapIdx63;bitmap[q]~(1Lr);// 标记为0释放numAvail;returnnumAvailmaxNumElems;// 全部释放则返回true}}示意图bitmap[0]64位[1][0][1][0][0]...[0] ↑ ↑ 已分配 空闲 → 分配这个三、双向链表管理// PoolArena中维护Subpage链表按规格PoolSubpageT[]tinySubpagePools;// tiny规格(512B)PoolSubpageT[]smallSubpagePools;// small规格(512B~8KB)// Subpage通过prev/next组成双向链表finalclassPoolSubpageT{PoolSubpageTprev;PoolSubpageTnext;voidaddToPool(){prevhead;nexthead.next;head.nextthis;next.prevthis;}}四、分配流程请求分配256字节 ↓ 查PoolThreadCache (tiny/small缓存) ↓ miss 查Arena.tinySubpagePools/smallSubpagePools ↓ 找到对应规格的Subpage链表 查Subpage.bitmap → 找空闲位 ↓ 分配成功 ✓ ↓ 无空闲Subpage → 从Chunk分配新Page → 初始化为Subpage五、总结组件说明bitmap用位图管理小块分配规格16B~4KB共12种规格双向链表同规格Subpage链接在一起ThreadLocal缓存优先从线程缓存获取上一篇【第57篇】PoolChunk内存分配源码全解析——buddy算法的工程实现下一篇【第59篇】RecvByteBufAllocator源码解析——动态调整接收缓冲区