系统中有多个 Arena 的原因是由于各个线程进行内存分配时竞争不可避免,这可能会极大的影响内存分配的效率,为了缓解高并发时的线程竞争,Netty 允许使用者创建多个分配器(Arena)来分离锁,提高内存分配效率 。
线程首次分配/回收内存时,首先会为其分配一个固定的 Arena 。线程选择 Arena 时使用 round-robin 的方式,也就是顺序轮流选取 。
每个线程各种保存 Arena 和缓存池信息,这样可以减少竞争并提高访问效率 。Arena 将内存分为很多 Chunk 进行管理,Chunk 内部保存 Page,以页为单位申请 。
文章插图
申请内存分配时,会将分配的规格分为如下四类,分别对应不同的范围,处理过程也不相同:
- tiny:代表了大小在 0-512B 的内存块 。
- small:代表了大小在 512B-8K 的内存块 。
- normal:代表了大小在 8K-16M 的内存块 。
- huge:代表了大于 16M 的内存块 。
- Chunk:一个 Chunk 的大小是 16M,Chunk 是 Netty 对操作系统进行内存申请的单位,后续所有的内存分配都是在 Chunk 里面进行操作 。
- Page:Chunk 内部以 Page 为单位分配内存,一个 Page 大小为 8K 。当我们需要 16K 的空间时,Netty 就会从一个 Chunk 中找到两个 Page 进行分配 。
- Subpage 和 element:element 是比 Page 更小的单位,当我们申请小于 8K 的内存时,Netty 会以 element 为单位进行内存分配 。element 没有固定大小,具体由用户的需求决定 。Netty 通过 Subpage 管理 element,Subpage 是由 Page 转变过来的 。当我们需要 1K 的空间时,Netty 会把一个 Page 变成 Subpage,然后把 Subpage 分成 8 个 1K 的 element 进行分配 。
线程分配内存主要从两个地方:PoolThreadCache 和 Arena 。其中 PoolThreadCache 线程独享,Arena 为几个线程共享 。
文章插图
初次申请内存的时候,Netty 会从一整块内存(Chunk)中分出一部分来给用户使用,这部分工作是由 Arena 来完成 。
而当用户使用完毕释放内存的时候,这些被分出来的内存会按不同规格大小放在 PoolThreadCache 中缓存起来 。当下次要申请内存的时候,就会先从 PoolThreadCache 中找 。
Chunk、Page、Subpage 和 element 都是 Arena 中的概念,Arena 的工作就是从一整块内存中分出合适大小的内存块 。
Arena 中最大的内存单位是 Chunk,这是 Netty 向操作系统申请内存的单位 。
而一块 Chunk(16M) 申请下来之后,内部会被分成 2048 个 Page(8K),当用户向 Netty 申请超过 8K 内存的时候,Netty 会以 Page 的形式分配内存 。
Chunk 内部通过伙伴算法管理 Page,具体实现为一棵完全平衡二叉树:
文章插图
【昨天,我彻底搞懂了Netty内存分配策略】二叉树中所有子节点管理的内存也属于其父节点 。当我们要申请大小为 16K 的内存时,我们会从根节点开始不断寻找可用的节点,一直到第 10 层 。
那么如何判断一个节点是否可用呢?Netty 会在每个节点内部保存一个值,这个值代表这个节点之下的第几层还存在未分配的节点 。
比如第 9 层的节点的值如果为 9,就代表这个节点本身到下面所有的子节点都未分配 。
如果第 9 层的节点的值为 10,代表它本身不可被分配,但第 10 层有子节点可以被分配 。
如果第 9 层的节点的值为 12,此时可分配节点的深度大于了总深度,代表这个节点及其下面的所有子节点都不可被分配 。
下图描述了分配的过程:
文章插图
对于小内存(小于 4096)的分配还会将 Page 细化成更小的单位 Subpage 。
Subpage 按大小分有两大类:
- Tiny:小于 512 的情况,最小空间为 16,对齐大小为 16,区间为[16,512),所以共有 32 种情况 。
- Small:大于等于 512 的情况,总共有四种:512,1024,2048,4096 。
第一次申请小内存空间的时候,需要先申请一个空闲页,然后将该页转成 PoolSubpage,再将该页设为已被占用,最后再把这个 PoolSubpage 存到 PoolSubpage 池中 。
推荐阅读
- 大学|高中生为什么要拼尽全力考入名校?这是我见到最好的答案
- 解冻淘宝店铺保证金需要把店铺商品下架吗 淘宝店被彻底释放了保证金怎么办?
- 生意参谋页面很多我想最快了解某一个指标 生意参谋商城点击占比在哪里
- 淘宝网店运营方案 淘宝运营方案策划
- 手机如何找回原来开的淘宝店铺 淘宝店铺被彻底释放后信誉还有吗
- 淘宝店铺推广方式 如何做淘宝推广
- 淘宝生意参谋怎么看同行转化率 阿里巴巴生意参谋怎么看同行数据
- 呈贡蒲门茶品鉴地,我们持盅看茶
- 怎么弄封别人的淘宝店 淘宝店铺被彻底释放了怎么办
- 淘宝卖家中心的体检中心在哪里 淘宝的体检中心在哪