netty源码阅读一(内存池之SizeClasses)

这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码

jemalloc论文

netty源码阅读一(内存池之SizeClasses)

netty源码阅读二(内存池之PoolChunk)

netty源码阅读三(内存池之PoolSubpage)

netty源码阅读四(内存池之PoolChunkList)

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计算出来的,其计算公式为:

                                                 size=(1<<log2Group)+nDelta*(1<<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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值