You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
source-code-hunter/docs/Netty/Netty技术细节源码分析/内存池之从内存池申请内存.md

2.5 KiB

该文所涉及的netty源码版本为4.1.16。

Netty内存池申请内存流程

在通股票PooledByteBufAllocator中向内存池中进行内存申请的时候最先开始的步骤便是从PooledByteBufAllocator中一系列PoolArena数组中选择其中一个PoolArena进行分配。

这时将会从PoolArena数组中选取当前使用量最小的PoolArena与当前线程通过ThreadLocal进行绑定之后涉及到内存申请将会直接从这个PoolArena进行获取这个做法在高并发情况下频繁往内存池中进行内存申请的时候可以减少资源竞争提升效率。

在当前线程获取与其绑定的PoolArena之后接下来就是从PoolArena中继续申请内存。
为了适应各种大小的内存场景PoolArena的组成也是为了其设计。

  • PoolSubpage数组 tinySubpagePools默认情况下当申请的内存小于512b的时候的时候将会从tinySubpagePools中直接选择subPage内存池中的最小单位返回
  • PoolSubpage数组 smallSubpagePools默认情况下当申请的内存大于512b但是小于一个page的大小8kb的时候将会从smallSubpagePools返回一个subPage。subPage是由poolChunk中的page分配而来。
  • PoolChunkList qInit存储内存利用率0-25%的poolChunk
  • PoolChunkList q000存储内存利用率1-50%的poolChunk
  • PoolChunkList q025存储内存利用率25-75%的poolChunk
  • PoolChunkList q050存储内存利用率50-100%的poolChunk
  • PoolChunkList q075存储内存利用率75-100%的poolChunk
  • PoolChunkList q100存储内存利用率100%的poolChunk、 当申请的内存大于一个page8kb但又小于一个poolChunk2048kb总大小的时候将会从各个PoolChunkList中尝试获取一个poolChunk从中返回。PoolChunkList是一个由poolChunk组成的链表。
    以上几个PoolChunkList由符合各个内存利用率的poolChunk组成这几个PoolChunkList之间又互相首尾连接组成队列方便PoolChunk在各个队列中根据自己当前的利用率进行转移到对应的位置上。
    最后当申请的内存大于一个poolChunk大小的时候将会直接申请一段非池化的内存返回并不会占用内存池中的内存空间。

最后到了从poolChunk中申请内存的场景这一部分在该文中已经详细说明,这部分也是内存池中获取内存的最后一步。