Netty 从4.1.52版本开始,其内存分配算法,从jemalloc3 切换到了 jemalloc4。本文给出该算法涉及的核心数据结构图示:
想要看懂上图, 要点如下:
1. 小于等于16777216字节的空间,从chunk(一个16M的字节数组)中分配,chunk是一个包含2048个page的run。
2. 每次分配, 会从chunk切割得到一个能容纳请求大小且最接近请求大小的run。
3. run是一个或多个page的集合,一个page是8Kb。
4. 空闲的run,其句柄信息会被放入优先队列数组runsAvail的槽位中。 比如:
- handle1,handle2分别代表的run1和run2,长度是2个page,会被放到runsAvail第1个槽位
- handle3代表的run3,长度是4个page,会被放到runsAvail第3个槽位
- 最小的run包含一个page,索引是0,存储在runsAvail[0],最大的run是2048个page,存储在runsAvail[39]。