引言
前文我们介绍了 Netty 中内存池的总体管理相关算法与思路。涉及到的内容包含有:小内存分配、内存块管理、线程缓存。
本文我们将进一步分析其代码实现,帮助读者彻底地掌握 Netty 中内存管理的实现方式。
初始化与内存分配器
内存池初始化
内存池 PollArena 是内存分配的主要切入点。我们先来看下其属性。PoolArena 的属性主要分为三类。
1. 不可变的实例属性,用于存储一些基本信息,如下:
- 内存页大小 pageSize。
- 内存页大小的 log2 值 pageShifts。
- 内存块大小 chunkSize。
- 触发内存页等分的子页大小溢出掩码 subpageOverflowMask。
- 存储不同的微小等分大小(从 16 至 512)的子页数组的长度 numTinySubpagePools。该变量为不可变静态类变量,值为 32( 512/16 )。
- 存储不同的小等分大小(从 512 至 pageSize)的子页数组的长度 numSmallSubpagePools。
2. 内存分配相关属性,如下:
- 用于存储不同等分大小的微小等分级别的子页的数组,tinySubpagePools。该数组上的元素实例仅用于充当链表头结点和通过头结点加锁进而保证链表操作的安全性场景。
- 用于存储不同等分大小的小等分级别的子页的数组,smallSubpagePools。与 tinySubpagePools 作用类似,只不过其管理的大小不同。
- 6 个不同使用率区间的 PoolChunkList 对象。