这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码
netty源码阅读五(内存池之PoolArena和PoolChunkList)
SizeClasses
sizeClasses是表示对于内存池中分配的内存大小需要对齐的size,在jemalloc论文中将其分为了三块,分别为Small,Large和Huge。其中Small和Large是在Arena中分配的,而Huge则是直接在Arena之外进行分配的。下面则是其对应的各个size的图。
不过对于Netty来说其对应的sizeClasses是有所不同的。下面的表格展示了netty的默认配置下对应的sizeClasses中缓存的数据内容,其中后面size ,hSize , Dsize不是其缓存的数据,size表示的是netty所支持的所有Huge之外的对齐的size(即从netty内存池中获取的除了Huge之外的内存的大小一定是size中的一个)。size是利用log2Group,nDelta和log2Delta计算出来的,其计算公式为:
hSize则是为了方便查看而将其转换为B这种形式,Dsize则是size与上一个size的差值。下面描述一下netty存储的其他的7列数据的含义。
- index:表示的是每个size类型的索引
- log2Group:表示的对应size的对应的组,用于计算对应的size
- log2Delata:表示的是和上一个sizeClass的差值的log2值,其实就是Dsize的log2值
- nDelta:表示的是这一组中的delta乘值
- isMultipageSize:表示的是这个size是否是page的倍数(这个表格的一个page的大小是1kB,故是1kB的倍数的size即为1)
- isSubPage:表示其是否为一个subPage类型(即这种类型的size需要利用subPage进行分配)
- log2DeltaLookup:表示的是lookup的size的值即为log2Delata值,其它时间则为0(代码中没看到具体用处)
netty默认的配置一个page的大小是2^13,即为1KB,默认的一个chunk的大小为16777216,即2MB。从下面的表格中可以看到其最小的分配单位是2B,最大的是2MB(这里的2MB不是netty的最大的分配大小,比2MB大的归为Huge类,netty直接从堆或者堆外内存中分配,不进行池化操作)。从2B到2MB,其中间的size的大小的生成规则其实就是以4个为一组,每组中其对应的与上一个size的差值是一样的(即log2Delta一样),而每组之间的差值数据则是以2的幂次进行增长(即log2Delta每隔一组会加一),当然第一组特殊除外。
index | log2Group | log2Delta | nDelta | isMultiPageSize | isSubPage | log2DeltaLookup | size | hSize | Dsize |
0 | 4 | 4 | 0 | 0 | 1 | 4 | 16 | 2B | 0 |
1 | 4 | 4 | 1 | 0 | 1 | 4 | 32 | 4B | 16 |
2 | 4 | 4 | 2 | 0 | 1 | 4 | 48 | 6B | 16 |
3 | 4 | 4 | 3 | 0 | 1 | 4 | 64 | 8B | 16 |
4 | 6 | 4 | 1 | 0 | 1 | 4 | 80 | 10B | 16 |
5 | 6 | 4 | 2 | 0 | 1 | 4 | 96 | 12B | 16 |
6 | 6 | 4 | 3 | 0 | 1 | 4 | 112 | 14B | 16 |
7 | 6 | 4 | 4 | 0 | 1 | 4 | 128 | 16B | 16 |
8 | 7 | 5 | 1 | 0 | 1 | 5 | 160 | 20B | 32 |
9 | 7 | 5 | 2 | 0 | 1 | 5 | 192 | 24B | 32 |
10 | 7 | 5 | 3 | 0 | 1 | 5 | 224 | 28B | 32 |
11 | 7 | 5 | 4 | 0 | 1 | 5 | 256 | 32B | 32 |
12 | 8 | 6 | 1 | 0 | 1 | 6 | 320 | 40B | 64 |
13 | 8 | 6 | 2 | 0 | 1 | 6 | 384 | 48B | 64 |
14 | 8 | 6 | 3 | 0 | 1 | 6 | 448 | 56B | 64 |
15 | 8 | 6 | 4 | 0 | 1 | 6 | 512 | 64B | 64 |
16 | 9 | 7 | 1 | 0 | 1 | 7 | 640 | 80B | 128 |
17 | 9 | 7 | 2 |