Netty16# 池化内存Subpage类型内存分配

前言

前面聊了大于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 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值