42、Netty源码分析:SizeClasses

目录

  • SizeClasses

SizeClasses

在netty中,内存会被切割成不同size的块,在分配的时候会根据所需的大小分配相应的内存大小,然而并不是所有的大小都会有相应大小的内存块,比如想要11kb的内存,它并不会确切的给你11kb,而是会根据一定的规则给你分配12kb,具体要给你分配多少是由SizeClasses来对齐的。

本片文章中用的netty源码版本为4.1.89.Final-SNAPSHOT,默认的chunk大小为4MB,page为8KB,则对应的SizeClasses类的属性值如下:

*

那么,这些属性值是怎么来的呢?在SizeClasses初始化的时候会根据默认的chunk和page大小产生一个二维数组,如下图红色方框内的数据,至于为什么会是这些值后续在分析,本文先了解这些值,本篇先关注的是绿色、蓝色和红色这三列数据,其中:

蓝色的数据计算公式如下:size = 1 << log2Group + nDelta * (1 << log2Delta)

红色的数据计算公式如下:isMultiPageSize为1开始递增。

因此,pageIdx2sizeTab[红色色数值] = 对应的蓝色数值,如pageIdx2sizeTab[0] = 8KB

sizeIdx2sizeTab[绿色数值] = 对应的蓝色数值,如sizeIdx2sizeTab[31] = 8KB

具体的数值如下:
*

从表中可以看到,netty把内存切分的很细,这样的切分既是为了充分利用内存,也是为了便于管理。

SizeClasses的存在是为了预先存储相关的数据,这样在使用的时候可以更快的根据相应的sizeId或者pageId找到相应的大小值,省去计算的时间,大概就是以空间换时间。它提供了相应的方法,如:

*

当然,它也提供了相反的方向,比如通过size寻找sizeIdx,方法为size2SizeIdx(int size),具体的源码不再分析。

至此,SizeClasses分析到此结束。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: